複数のソースからデータを取得して ZIP ファイルに書き込むクラスがあります。クラスをベンチマークして、使用CompressionLevel.Optimal
が よりもはるかに遅くなるかどうかを確認しましたCompressionLevel.Fastest
。しかし、ベンチマークは、ベンチマークを実行するたびに、異なる繰り返しで異なるCompressionLevel
値で例外をスローします。
空のzipファイルを作成して削除する以外に基本的に何もしない以下のコード(forループ内)になるまで、ファイルコンテンツを追加するメソッドを段階的に削除し始めました。
簡略化されたコード:
var o = @"e:\test.zip";
var result = new FileInfo(o);
for (var i = 0; i < 1_000_000; i++)
{
// Alternate approach
// using(var archive = ZipFile.Open(o, ZipArchiveMode.Create))
using (var archive = new ZipArchive(result.OpenWrite(), ZipArchiveMode.Create, false, Encoding.UTF8))
{
}
result.Delete();
}
result
ループは私の PC で約 100 から 15k の反復を実行し、ファイル ( ) がロックされていることを示すファイルを削除しようとすると IOException をスローします。
それで...使用方法について何か見逃しましたSystem.IO.Compression.ZipArchive
か?ZipArchive には close メソッドがなく、使用するとアーカイブを破棄/閉じる必要があります...さまざまな .NET バージョン 4.6、4.6.1、4.7、および 4.7.2 を試しました。
編集 1:は、ベンチマークされたコードの一部で
はありませんresult.Delete()
編集 2:
またThread.Sleep(5/10/20)
、ブロックを使用した後で (したがって、result.Delete()
ロックが持続するかどうかを確認するために) 試してみましたが、最大 20 ミリ秒まで、ファイルはある時点でまだロックされています。20ms よりも高い値は試しませんでした。
編集 3:
自宅で問題を再現できません。仕事で何十回も試しましたが、ループは20kの反復に達しませんでした。ここで一度試して完了しました。
編集 4:
jdweng (コメントを参照) は正しかった。ありがとう!これは、ローカル hdd の「e:」パーティションに何らかの形で関連しています。同じコードは、ローカル ssd の "c:" パーティションとネットワーク共有でも問題なく実行されます。