5

私は異常な問題に直面しています.5分ごとに実行されるようにスケジュールされたツールを構築しています. 特定のディレクトリから zip ファイルを取得し、(ファイル名に応じて) ファイルを目的の場所に抽出します。私はzipentryzipファイルで各ファイル名を取得し、必要に応じて抽出してから、それらを特定のディレクトリに戻し(zipファイル、zip内のすべてのファイルを終了したら)、zipファイルを削除します。ただし、(常にではありませんが) zip ファイルが削除されないことがあります。を使っているのでfileutils.forcedelete()。例外が発生しています:ファイルを削除できませんfileutils.forcedeleteonexit()そこで、ソースに残っているファイルをそのまま使うコードに変更しました。

これが私のコードのサンプルです:

sourceFile=new file(zipfile);
zipFile = new ZipFile(sourceFile);
zEnum = (Enumeration<ZipEntry>) zipFile.entries();
for (int a = 0; a < zipFile.size(); a++)
{
  ZipEntry zE = zEnum.nextElement();
  //Function uses zip4j for extracting. No streams used.
  extract(String sourceZipFile, String fileNameToExtract, String outputFolder);
}
//I tried it with finally either
zipFile.close();

//Using fileutils to copy. No streams used.
copyFile(sourceFile, backup);

FileUtils.forceDeleteOnExit(sourceFile);

使用されているストリームはありませんが、ファイルがロックされることがあります (常にではありません)。ここでバグと思われるものは何ですか?問題を引き起こしているのはzip4jの抽出ですか、それとも何か他のものですか? 私はzip4j 1.3.1を使用しています。

4

2 に答える 2

0

ファイルを削除しようとしているときにフラッシュされないことがあるOSファイルバッファに関連する問題だと思います。FileUtils.forceDeleteOnExit(sourceFile) の代わりに sourceFile.deleteOnExit() を使用しようとしましたか? また、削除する前に sourceFile.canWrite を確認することもできます (役立つ場合があります)。削除する前に FileInputStream() を使用することもできます。

FileInputStream fi = new FileInputStream(sourceFile);
fi.getFD().sync();
于 2013-06-07T12:55:21.693 に答える