1. ホーム
  2. c#

[解決済み] 同じボリュームをソースとデスティネーションの両方として使用することはできません

2022-02-27 02:01:03

質問

以下のコードで分割アーカイブを作成しています。

string filename = "FileName.pdf";
using (ZipFile zip = new ZipFile())
{
    zip.UseZip64WhenSaving = Zip64Option.Default;
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Default;
    using (FileStream stream = new FileStream(temp, FileMode.Open))
    {
        zip.AddEntry(filename, stream);
        zip.MaxOutputSegmentSize = settings.AttachmentSize * (1024 * 1024);
        zip.Save(zipFileName);
    }
}

上記のコードでは、3つのファイルが生成されます。 file.zip, file.z01 and file.z02 . そのzipファイルを右クリックし Extract All (WinRARなどのzipソフトを使わず、Windows内蔵のzipだけで展開)すると、以下のようなエラーになります。

同じボリュームをコピー元とコピー先の両方として使用することはできません。

変なのは、最初にファイルを取り出そうとしたときだけ起こることで、それ以降は問題なく取り出せるので、最初にファイルがどのように圧縮されたかが問題なのでしょう。

アップデイト1

別のフォルダに解凍しても同じことが起こる

DotNetZip Codeplexのサイトでもこの問題について議論されていますが、まだ解決されていないようです。

http://dotnetzip.codeplex.com/discussions/239172

http://dotnetzip.codeplex.com/discussions/371005

アップデイト2

のドキュメントを見ると MaxOutputSegmentSize プロパティで、引用されています。

Windowsエクスプローラで分割アーカイブを展開できるとは思えません。

しかし、その理由についての詳しい説明はありません。上記の通りなので、誤検出と判断しています。

この現象は、最初にファイルを展開しようとしたときだけ発生します。 その後の抽出は問題なし

Windows 8.1 64bitを使用しています。

解決方法を教えてください。

ソフトウエアの不具合の原因を探るとき、まず最初にすることは、エラーメッセージの発生源を突き止めることでしょう。 そのためには まずはGoogleで . 2回目のヒット(今)は金字塔。 誰か という名前のファイルにあるリソースID #10209 という特定の文字列を見つけ、Windows 実行ファイルをデコンパイルしました。 zipfldr.dll マイクロソフトの著作権表示付き

zipfldr.dllは、Windowsが.zipファイルの内容をフォルダのように表示するために使用するシェル名前空間拡張子で、これは見事に一致します。 Regedit.exeで、次の場所に移動して見ることができます。 HKEY_CLASSES_ROOT\CLSID\ {E88DCCE0-B7B3-11d1-A9F0-00AA0060FA31} を一次登録します。 その HKEY_CLASSES_ROOT\SystemFileAssociations\ .zip\CLSID レジストリキーは、.zip ファイルと関連付けます。

つまり、エクスプローラーの拡張子が倒れるというのは厳然たる事実なんですね。 もちろん、あなたができることはほとんどありません。 唯一残っている疑念は、使用しているZipライブラリが、スパンファイルの内容を混乱させ、その結果、拡張子が倒れる原因になっている可能性があることです。 IonicとDotnetzipの両方が全く同じバグを持っている確率は低いでしょう。 プログラマーは、他のプログラマーのコードからインスピレーションを得て、「どうしてこうなるのか」を考えることがあります。 このエラーが偽りのものであるという事実は、棺桶に釘を刺すようなもので、あなたは悪いzipアーカイブのコンテンツが繰り返しエラーを引き起こすことを期待しているのです。

あなた かもしれない SysInternalsのプロセスモニターを使えば、根本的な問題をリバースエンジニアリングすることができます。 エクスプローラがファイルを読み書きしているのが見えるはずだ。 おそらくTEMPディレクトリで、そのディレクトリに.zipファイルがすでに存在する場合、このようなエラーが発生すると推測されます。 TEMP はほとんどのマシンにおいて非常に乱雑なフォルダで、多くのプログラムが適切に後始末をしないのです。 zip ライブラリも含めて、他の証明のない魅力的な理論です :)

それでもダメなら、最終的にはマイクロソフトに頼るしかない。 マイクロソフトには1-800の電話番号があり、製品に関する問題のサポートを受けることができます。 私は何度か利用したことがありますが、いつも問題を解決してくれて、初期費用を返金してくれました。 しかし、これはWindowsの問題であり、10億人のユーザーを持つ製品である。 せいぜい回避策を講じる程度で、実際にソフトウェアで修正できる可能性は極めて低いでしょう。 全く不可能というわけではなく、実際に行われています。 しかし、彼らが推奨する回避策は、Winzip"のようなサードパーティのユーティリティを使用することです。 あなたが聞きたいことではありません。