Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ロックされたファイルの削除

java6.0です。
ロックされたファイルを削除したいのですが
リリースしなければ削除できないのでしょうか。


// ファイルをロックします。
fileOutputStream = new FileOutputStream(file.getAbsoluteFile(), true);
FileChannel fc = fileOutputStream.getChannel();
fileLock = fc.tryLock();
.
.
.
// ファイルを削除します。
// file.delete(); ここでのファイル削除は無理
if (fileLock != null) {
    fileLock.release();
}
if (fileOutputStream != null) {
    fileOutputStream.close();
}
file.delete();


ファイルをロックしているメソッドと削除メソッドは別です。
リリースしてから削除のためリリース直後に別のプログラムがそのファイルをロックしてしまった場合、削除に失敗となるかと思います。
FileLockクラスを使用したコードではファイルロック中に削除(安全な削除)はできないのでしょうか。

4

回答

87446

閲覧

4件の回答

評価

0

そもそも、削除を含め変更しないことを保証するために
ロックするんだ。別の箇所から削除するとは言え、
「ロックしてるから削除できない」というのは、単純に
役割分割とロジックの組み立てができてないからだろう。

評価

0

あるファイルが存在します。
そのファイルを読み込み処理をし、削除しなければなりません。
ただし、仕様上以下の条件があります。
1.必ず処理の最後で削除すること。
    処理で失敗した場合、ファイルの削除をしてはいけません。
    ファイルを一度移動し、元に戻す方法も許されません。
2.処理中は他のプロセスから読み書きを許してはいけません。

上記条件があるので、ファイルのロック中に削除できれば一番有りがたかったのですが、別の方法で考えてみます。

評価

0

質問者です。

.netでやったことがあるような気がしたので調べると
System.IO.FileStream fs = new System.IO.FileStream(
                fileName,
                System.IO.FileMode.Open,
                System.IO.FileAccess.Read,
                System.IO.FileShare.Delete);
// ロック中の削除
System.IO.File.Delete(fileName);
fs.Close();
簡単に実装できました。

Javaでは上記のようなコードを書くことはやはり無理でしょうか。

評価

0

Javaではロック中の削除はできないと思います。
OSの機能を使っていると思われるので、実装が可能なOSとそうでないOSがあるのではないでしょうか。

>2.処理中は他のプロセスから読み書きを許してはいけません。

このプロセスのプログラムも変更することが可能な場合ですが。
処理対象ファイルへのアクセスを制御する為のファイルAを用意して、そのAにロックをかけられたら、処理対象ファイルに対する処理を行い、Aのロックを解除する。
というルールを他のプロセスにも適用できれば削除まで安全に行えるのではないでしょうか。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。