Sprawdzanie uprawnień przez AccessController nie działa

0

Chcę sprawdzić czy mam uprawnienia do zapisania pliku w katalogu.

Mój kod:

//ściezka - file://C:/Windows
try {
    FilePermission perm = new FilePermission("file://" + file.getAbsolutePath().replace("\\", "/") + File.separator + aaaa.jpg", "write");
    AccessController.checkPermission(perm);
}
catch(AccessControlException ace) {
    System.out.println(ace);
}

Mimo iż wybieram katalog do którego nie mam uprawnień AccessController nie wyrzuca niczego i jedzie dalej co skutkuje już błędami Javy.

Co w moim kodzie jest źle?

0

Dlaczego wywołujesz

replace("\", "/")
?

0

Wydawało mi się, że tak będzie poprawnie.

Usunąłem tą instrukcję i nadal to samo.

0

U mnie (XP, Java 1.6.20) działa dobrze. Jak Ty kompilujesz swój kod? Wiersz

FilePermission perm = new FilePermission("file://" + file.getAbsolutePath() + File.separator + aaaa.jpg", "write");

ma błędy składniowe.

0

Ucięło mi cudzysłów przy wklejaniu.

Oczywiście że ma być:
FilePermission perm = new FilePermission("file://" + file.getAbsolutePath() + File.separator + "aaaa.jpg", "write");

I taki własnie kod nie działa.

NetBeans 6.9 (applet viewer) Java 1.6.0_20 Win7

0

Twój kod jest fragmentem apletu? Aplet jest podpisany? Appletviewer jest w tej sprawie niemiarodajny, uruchom aplet w przeglądarce.
//edit
Umieściłem powyższy kod w aplecie i też działa (w programie appletviewer i w przeglądarkach).

0

W takim razie co mogę zrobić jeśli w moim przypadku kod nie dziala?

0
public boolean canWrite(File file) {
    try {
        FileChannel channel = new RandomAccessFile(file, "rw").getChannel();
        channel.tryLock();
        channel.close();
        return file.canWrite();
    } catch (IOException e) {
        return false;
    }
}
0

Chodziło mi raczej o rozwiązanie które pomoze mi dojść czemu normalne rozwiązanie nie dziala? Może to wina systemu (win7) ?

0

@ehm Spróbowałem Twojego kodu, jednakże zwraca on FALSE nawet jesli zaznaczę katalog do którego mam uprawnienia (operuję tylko na katalogach, nie plikach).

0

Sprawdziłem kod

        try
        {
            File file=new File("C:\\Windows");
            FilePermission perm = new FilePermission(file.getAbsolutePath() + File.separator + "aaaa.jpg", "write");
            AccessController.checkPermission(perm);
        }
        catch(AccessControlException ace)
        {
            System.out.println(ace);
        }

w systemie win7. Działa poprawnie i w apletach i w "normalnych" aplikacjach. Jesteś pewien, że nie masz prawa zapisu w katalogu C:\Windows ?

0

Jestem pewny.

Nie zmienialem nic w zadnych podobnych plikach.

0

Poświęciłem kilka minut i potestowałem na kilkunastu komputerach uczelnianych. Na każdym działa.
Masz wyjątkowo felerny komputer albo czegoś nie rozumiesz. Zamieściłeś taki kod:

        try
        {
            File file=new File("C:\\Windows");
            FilePermission perm = new FilePermission(file.getAbsolutePath() + File.separator + "aaaa.jpg", "write");
            AccessController.checkPermission(perm);
        }
        catch(AccessControlException ace)
        {
            System.out.println(ace);
        }
        //dalszy ciąg

Niezależnie od tego czy wystąpi wyjątek, czy nie, dalszy ciąg się wykona.
Druga rzecz, pisałeś o apletach. Skąd wiesz, że nie wystąpił wyjątek? Standardowo aplet nie otwiera konsoli, więc nie zobaczysz komunikatu o błędzie.

0

@bo: Dziękuję za Twój czas i nerwy :)

Również wkleiłem ten kod do osobnego pliku i niestety nie działa.
Oczywiście rozumiem że kod już poza blokiem try/catch zostanie wykonany w kazdym przypadku.
Poprzez "nie działa" rozumiem, że instrukcja System.out.println("ajsjdhru!!") zamieszczona w bloku catch sie nie wykonuje.

Bład Javy wyświetla sie dopiero kiedy dochodzi do instrukcji własciwego zapisania pliku do okreslonego folderu.

0

OK, posprawdzałem na wszystkie możliwe sposoby.

Jeśli jest to aplet nie działa, jesli aplikacja desktopowa - działa.

Co do tego co pisałeś o konsoli w apletach. Spróbowalem taki kod:

boolean aaa=false;
try
        {
            File file=new File("C:\\Windows");
            FilePermission perm = new FilePermission(file.getAbsolutePath() + File.separator + "aaaa.jpg", "write");
            AccessController.checkPermission(perm);
        }
        catch(AccessControlException ace)
        {
            aaa=true;
            System.out.println(ace);
        }

System.out.println(aaa);

Pojawia sie FALSE zatem to nie wina konsoli.

1 użytkowników online, w tym zalogowanych: 0, gości: 1