0

なぜこれがうまくいかないのかわからない - 私を夢中にさせ始めている!

他の誰もこの問題を抱えていないようです

私のコードは次のようになります。

        Stream stream = new MemoryStream();
        try
        {
            // output zip
            using (ZipFile zipFile = new ZipFile())
            {
                zipFile.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
                ForEach(DataFile file In DataFiles)
                {
                    String sourcePath = dataFile.Path;
                    String archiveName = dataFile.RealName;
                    //byte[] fileContents = File.ReadAllBytes(sourcePath);
                    //zipFile.AddEntry(archiveName, fileContents);
                    zipFile.AddFile(sourcePath, archiveName);
                    //e.FileName = archiveName;
                }

                zipFile.AddEntry("README.TXT", readmeMessage);
                zipFile.Save(stream);
            }
        }
        catch (Exception ex)
        {
            throw;
        }

すべてのファイル パスが有効です。

残りをコメントアウトすると、readme ファイルを追加しても問題なく動作します。ただし、他のファイルを追加すると、zip ファイルが無効になります。

提案をいただければ幸いです。

ありがとう

アップデート

ストリームを正確に正しいサイズで初期化すると、それが機能することに気付きました。アーカイブをディスクに書き込まずにサイズを取得する方法を知っている人はいますか?

さらに更新

今のところ回避策を追加しました。

アーカイブをディスクに保存し、それを別のストリームに読み込むことで、必要なことを行うことができます

非常に不自由で、私はそれが本当に好きではないので、誰かがより良い方法を提案できるなら、私は感謝しています!

4

2 に答える 2

1

私はそれを使ったことはありませんが、DotNetZip ライブラリの例 (いくつかのチェック、コメント、および関連する行は削除されていません) を調べると、次のことがわかりました。

public static void Main(String[] args)
{
    ... some input checking ...

    string ZipFileToCreate = args[0];
    string DirectoryToZip = args[1];
    try
    {
        using (ZipFile zip = new ZipFile())
        {
            // note: this does not recurse directories! 
            String[] filenames = System.IO.Directory.GetFiles(DirectoryToZip);
            foreach (String filename in filenames)
            {
                Console.WriteLine("Adding {0}...", filename);
                ZipEntry e = zip.AddFile(filename);
                e.Comment = "Added by Cheeso's CreateZip utility.";
            }

            zip.Save(ZipFileToCreate);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }
}
于 2013-08-17T22:38:50.553 に答える
0

zipアーカイブが特定のサイズに達すると(実際の制限を確認するのに十分なテストを行っていません)、ストリームに確実に保存できないようです。

誰も言っていないようですが、これを回避する唯一の方法は、アーカイブをディスクに保存することです。

于 2013-09-12T09:32:17.977 に答える