2012-06-24 118 views
5

我正在製作一個監控和備份目錄的java程序。有時我必須將修改後的文件上傳到存儲庫或下載,如果有新版本的話。 爲了做到這一點,我必須鎖定文件,以便用戶無法更改內容或將其刪除。 目前我使用這個代碼鎖定文件:文件鎖定和刪除

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

但是,如果有新的版本,我不得不刪除舊文件,並更換新的。 但文件鎖不允許我刪除該文件。

我應該解鎖並刪除它寫信,相信用戶不會寫入文件?或者有沒有其他的方式來做到這一點?

+1

這無論如何都不會工作。 FileLocks不會阻止用戶更改或刪除文件。它們只會阻止其他程序鎖定文件。 – EJP

回答

3

你可以截斷文件:

fileChannel.truncate(0); 

事後寫在它的新版本,這不會造成時間上的差距,其中,用戶可以重新創建該文件。

從技術文檔:

如果給定大小小於該文件的當前大小,文件 被截斷,丟棄任何字節超出文件的新的終端。如果 給定的大小大於或等於文件的當前大小 那麼文件不會被修改。在任何一種情況下,如果此頻道的文件位置 大於給定大小,則將其設置爲該大小。

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

+0

除非我錯過了大圖,否則只會刪除文件的內容。所以這不是我需要的。 – user1308768

+0

*我應該解鎖並刪除它寫信,相信用戶不會寫入文件?或者是否有其他方法可以做到這一點?*我用* truncate *回答,可以在文件被鎖定後清除內容並將新內容寫入其中,以便刪除文件並根據要同步的文件創建新文件。 –

+0

我只是添加一些額外的解釋...請讓我知道,如果你需要更多的澄清。 –