2012-06-24 12 views
5

Realizzo un programma in java che esegue il monitoraggio e il backup di una directory. Di volta in volta devo caricare i file modificati nel repository o scaricare se c'è una nuova versione di esso. Per fare questo devo bloccare il file in modo che l'utente non sia in grado di modificare il contenuto o cancellarlo. Attualmente sto usando questo codice per bloccare il file:Blocco file ed eliminazione

 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(); 
     } 

Tuttavia, se c'è una nuova versione devo eliminare il file vecchio e sostituirlo con uno nuovo. Ma il blocco file non mi consente di eliminare il file.

Devo sbloccare ed eliminare scrivere via, credendo che l'utente non scriverà nel file? O c'è un altro modo per farlo?

+1

Questo non funziona comunque. FileLocks non impedisce all'utente di modificare o eliminare il file. Impediscono solo agli altri programmi di bloccare il file. – EJP

risposta

3

Si potrebbe troncare il file:

fileChannel.truncate(0); 

e poi scrivere la nuova versione su di esso, questo non creerebbe l'intervallo di tempo in cui l'utente può creare di nuovo il file.

Da documentazione:

Se la dimensione del dato è inferiore dimensioni attuali del file, il file viene troncato , scartando tutti i byte oltre la nuova fine del file. Se la dimensione specificata è maggiore o uguale alla dimensione corrente del file , il file non viene modificato. In entrambi i casi, se la posizione del file del file è superiore alla dimensione specificata, viene impostata su quella dimensione.

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

+0

A meno che non manchi l'immagine grande, questo cancella solo il contenuto del file. Quindi non è quello di cui avevo bisogno. – user1308768

+0

* Devo sbloccare ed eliminare scrivere via, credendo che l'utente non scriverà nel file? O c'è un altro modo per farlo? * Ho risposto con * truncate * che è possibile utilizzare dopo che il file è bloccato per cancellare il contenuto e scrivere il nuovo contenuto su di esso, in modo da non avere il divario di tempo tra cancellare il file e creare il nuovo in base al file da sincronizzare. –

+0

Aggiungo solo alcune spiegazioni aggiuntive ... per favore fatemi sapere se avete bisogno di ulteriori chiarimenti. –

Problemi correlati