2012-06-24 16 views
5

Tworzę program w języku Java, który monitoruje i tworzy kopię zapasową katalogu. Od czasu do czasu muszę przesłać zmodyfikowane pliki do repozytorium lub pobrać je, jeśli istnieje nowa wersja. W tym celu muszę zablokować plik, aby użytkownik nie mógł zmienić jego zawartości ani go usunąć. Obecnie używam tego kodu, aby zablokować plik:Blokowanie i usuwanie plików

 file = new RandomAccessFile("C:\\Temp\\report.txt", "rw"); 

     FileChannel fileChannel = file.getChannel(); 
     fileLock = fileChannel.tryLock(); 
     if (fileLock != null) { 
      System.out.println("File is locked"); 

      try{ 

      //Do what i need  

      }catch (Exception e){//Catch exception if any 
       System.err.println("Error: " + e.getMessage()); 
      } 
     } 
     else{ 
      System.out.println("Failed"); 
     } 
    } catch (FileNotFoundException e) { 
     System.out.println("Failed"); 
    }finally{ 
     if (fileLock != null){ 
      fileLock.release(); 
     } 

Jednak jeśli pojawia się nowa wersja muszę usunąć stary plik i zastąpić nową. Ale blokada pliku nie pozwala mi usunąć pliku.

Czy mogę je odblokować i usunąć, zapisując, ufając, że użytkownik nie napisze w pliku? Czy jest jakiś inny sposób robienia tego?

+1

To nie będzie działać tak. FileLocks nie uniemożliwiają użytkownikowi zmiany lub usunięcia pliku. Zapobiegają tylko blokowaniu pliku przez inne programy. – EJP

Odpowiedz

3

Można obciąć pliku:

fileChannel.truncate(0); 

a potem napisać nową wersję nad nim, to nie spowodowałoby lukę czasową, w której użytkownik może ponownie utworzyć plik.

Z dokumentacji:

Jeśli dany rozmiar jest mniejszy niż bieżący rozmiar pliku, a następnie plik jest skrócona, odrzucając jakiekolwiek bajtów poza nowym końca pliku. Jeśli podany rozmiar jest większy lub równy bieżącemu rozmiarowi pliku , plik nie zostanie zmodyfikowany. W obu przypadkach, jeśli pozycja tego kanału w pliku jest większa niż podany rozmiar, to jest ustawiona na taki rozmiar.

http://docs.oracle.com/javase/7/docs/api/java/nio/channels/FileChannel.html#truncate%28long%29

+0

Chyba że brakuje mi dużego obrazu, który tylko usuwa zawartość pliku. Więc nie tego potrzebowałem. – user1308768

+0

* Czy powinienem je odblokować i usunąć, pisząc, ufając, że użytkownik nie napisze w pliku? Czy jest jakiś inny sposób robienia tego? * Odpowiedziałem * skróconym *, którego można użyć po zablokowaniu pliku, aby wyczyścić zawartość i napisać na nim nową treść, aby nie było przerwy między usunięciem plik i utwórz nowy na podstawie pliku do zsynchronizowania. –

+0

Po prostu dodaję dodatkowe wyjaśnienie ... proszę dać mi znać, jeśli potrzebujesz więcej wyjaśnień. –