2012-06-24 10 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

私はちょっと追加の説明を追加します...もっと明確にする必要がある場合はお知らせください。 –

関連する問題