java: Kontroller, om en fil kan flyttes under vinduer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg skal omdøbe en fil (holder den i samme mappe);
Jeg kan ikke synes at finde en måde at se, om mit program har de nødvendige tilladelser:


Files.isWritable(directory) && Files.isWritable(oldFile);


Returnerer altid sandt, om eller ej den løbende bruger har tilladelse til at skrive filen (jeg antager, at de kun kontrollerer, om filen er skrivebeskyttet, selv om dette krænker kontrakten angivet i javadoc);
Jeg kører ikke under en sikkerhedschef, så jeg kan ikke ringe


System.getSecurityManager.checkDelete(oldFile.toString());


Jeg skal kontrollere, om omdøbningen af ​​flere filer vil (formentlig) lykkes, så jeg kan ikke prøve at fange undtagelsen.

Er der en vej ud? Selvfølgelig ville en bærbar løsning være elskelig, men jeg ville afregne en windows-specifik en ...

Bedste reference


Du kan ikke tjekke Windows ACL'er på den måde. Den 'native' -løsning er ret let, da Windows understøtter transaktioner på filsystemet. Ring blot DeleteFileTransacted og rul tilbage transaktionen, hvis en sletning mislykkes.


Hvis du ikke bruger tranactions, så er den anden mulighed først at åbne håndtag med eksplicit DELETE ønsket adgang (DELETE er en af ​​de standard WinNT adgangsrettigheder), nægter enhver deling. Hvis og kun hvis dette lykkes for alle filer, sletter dem alle med SetFileInformationByHandle(handle, FileDispositionInfo, &fdiObj, sizeof(fdiObj));


(Sidstnævnte er ikke en transaktion og kan have isoleringsproblemer som følge heraf, som igen påvirker atomomhed).

Andre referencer 1


Prøv new SecurityManager().checkDelete(oldFile.toString()).

Andre referencer 2


Bare prøv at flytte det! Hvis flytningen mislykkedes, havde du ikke tilladelser, eller noget andet gik galt.


Dette er et generelt princip. Forsøg ikke at forudsige fremtiden, gætte om en forestående operation vil lykkes. Prøv operationen. Ellers introducerer du alle mulige ekstra problemer:



  1. Du kan lave den forkerte test.

  2. Betingelsen kan ændre sig mellem testen og operationen.

  3. Funktionen returnerer som regel en fejl eller kaster en undtagelse alligevel, som du skal skrive kode til at håndtere: hvorfor skrive det hele to gange?