web-dev-qa-db-ja.com

同じボリュームをソースと宛先の両方として使用することはできません

次のコードを使用して分割アーカイブを作成しています。

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またはその他の圧縮ソフトウェアを使用せずに、組み込みのWindows Zipのみを使用)すると、次のエラーが発生します。

同じボリュームをソースと宛先の両方として使用することはできません

enter image description hereenter image description here

奇妙なのは、初めてファイルを抽出しようとしたときにのみ発生することです。その後の抽出は問題ないので、最初にファイルを圧縮した方法である必要があります。

更新1

別のフォルダに抽出しても同じことが起こります

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

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

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

更新2

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

Windowsエクスプローラーが分割アーカイブを抽出できるとは思いません。

その理由についてはこれ以上の説明はありません。これは偽陽性であると私は考えています。

それは私が初めてファイルを抽出しようとしたときにのみ発生し、その後の抽出は問題ありません

Windows 8.1 64ビットを使用しています。

33
jmc

ソフトウェアが失敗する理由を探すときに常に最初にしたいことは、エラーメッセージの原因を特定することです。 最初にGoogleを使用 でそれを行います。 2番目のヒット(今のところ)はゴールデンです somebody はWindows実行可能ファイルを逆コンパイルし、この特定の文字列をリソースID#10209としてzipfldr.dllという名前のファイルに配置し、Microsoftの著作権通知を付けました。

これは優れた一致です。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のプロセスモニターを使用して行います。 Explorerがファイルを読み書きしているのがわかります。おそらくTEMPディレクトリにあると思いますが、.Zipファイルがそのディレクトリにすでに存在していると、このようなエラーが発生すると思います。 TEMPはほとんどのマシンで非常に乱雑なフォルダであり、あまりにも多くのプログラムが自分自身を適切にクリーンアップしません。 Zipライブラリを含む、魅力的な理論で、他の方法では証明されません:)

それがうまくいかない場合、最終的なフォールバックはマイクロソフトです。 1から800の電話番号があり、製品の問題に関するサポートを受けることができます。私は何度かそれを使用しました、彼らはいつも私の問題を解決し、前払い料金を払い戻しました。これはWindowsの問題ですが、10億人のユーザーがいる製品です。あなたはせいぜい、回避策を得るでしょう、実際のソフトウェア修正は非常にありそうもないです。完全に不可能ではありませんが、それは行われました。しかし、推奨される回避策は「Winzipのようなサードパーティのユーティリティを使用する」という非常に高い確率です。あなたが聞きたいものではありません。

15
Hans Passant

Zipファイルを別のフォルダに移動するか、7Zipを使用してファイルを抽出してみてください。

0
Edgar K