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

ただし、新しいバージョンがある場合は、古いファイルを削除して新しいファイルに置き換える必要があります。しかし、ファイルロックではファイルを削除できません。

ユーザーがファイルに書き込まないことを信頼して、ロックを解除して書き込みを削除する必要がありますか? または、これを行う他の方法はありますか?

4

1 に答える 1

3

ファイルを切り捨てることができます:

fileChannel.truncate(0);

その後、新しいバージョンを上書きしても、ユーザーがファイルを再度作成できる時間のギャップは生じません。

ドキュメントから:

指定されたサイズがファイルの現在のサイズよりも小さい場合、ファイルは切り捨てられ、ファイルの新しい末尾を超えるバイトは破棄されます。指定されたサイズがファイルの現在のサイズ以上の場合、ファイルは変更されません。いずれの場合も、このチャネルのファイル位置が指定されたサイズより大きい場合は、そのサイズに設定されます。

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

于 2012-06-24T18:20:21.253 に答える