如何在zip文件中压缩多个文件

Day*_*yan 6 .net c# compression asp.net file

我正在尝试将两个文本文件压缩为zip文件.这是我的公共方法的样子:

public ActionResult Index()
{

    byte[] file1 = System.IO.File.ReadAllBytes(@"C:\file1.txt");
    byte[] file2 = System.IO.File.ReadAllBytes(@"C:\file2.txt");
    Dictionary<string, byte[]> fileList = new Dictionary<string, byte[]>();
    fileList.Add("file1.txt", file1);
    fileList.Add("file2.txt", file2);
    CompressToZip("zip.zip", fileList);

    return View();
}
Run Code Online (Sandbox Code Playgroud)

这就是我的压缩方法的样子:

private void CompressToZip(string fileName, Dictionary<string, byte[]> fileList)
{
    using (var memoryStream = new MemoryStream())
    {
        foreach (var file in fileList)
        {
            using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
            {
                var demoFile = archive.CreateEntry(file.Key);

                using (var entryStream = demoFile.Open())
                using (var b = new BinaryWriter(entryStream))
                {
                    b.Write(file.Value);
                }
            }
        }

        using (var fileStream = new FileStream(fileName, FileMode.Create))
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.CopyTo(fileStream);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在这种方法中,完美地创建了zip文件夹.但问题是我在zip文件夹中只得到一个文件(只有第二个文件将在zip文件夹中创建).没有发现错误.

问题:如何将两个文本文件压缩到zip文件夹中?

先谢谢你!

Phi*_*oss 11

您的代码实际上是将两个单独的zip存档保存到zip.zip文件中(ZipArchive为每个要压缩的文件创建一个新的).第一个zip存档仅包含,仅包含file1.txt第二个file2.txt.zip.zip在Windows资源管理器中打开时,它只显示第二个zip存档的内容.

要创建包含两个文件的单个zip存档,只需移动循环ZipArchive外部的创建fileList:

using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{
    foreach (var file in fileList)
    {                    
        var demoFile = archive.CreateEntry(file.Key);

        using (var entryStream = demoFile.Open())
        using (var b = new BinaryWriter(entryStream))
        {
            b.Write(file.Value);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


Geo*_*mes 6

乍一看,我建议你foreach围绕这个说法using var (archive = new ZipArchive...)是错误的.

这样,ZipArchive每次迭代foreach循环时都会创建一个新的.

当然你想创建ZipArchive和循环foreach 内部的那个?

像这样:

private void CompressToZip(string fileName, Dictionary<string, byte[]> fileList)
{
    using (var memoryStream = new MemoryStream())
    {
        using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
        {
            foreach (var file in fileList)
            {   
                var demoFile = archive.CreateEntry(file.Key);

                using (var entryStream = demoFile.Open())
                using (var b = new BinaryWriter(entryStream))
                {
                    b.Write(file.Value);
                }
            }
        }

        using (var fileStream = new FileStream(fileName, FileMode.Create))
        {
            memoryStream.Seek(0, SeekOrigin.Begin);
            memoryStream.CopyTo(fileStream);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助!