将目录添加到现有的.zip文件中

时间:2016-07-22 10:21:48

标签: c# compression system.io.compression

首先,我想说我已经尝试寻找解决方案,我没有找到一个我不必解压缩,添加我的文件夹,然后再拉链。我没有使用任何第三方库。如果可能的话,我想使用system.io.compression来做这个...如果不是,我会使用dotnetzip作为我的最后手段。

TL;博士。 我希望能够将包含文件的目录添加到已创建的zip文件中。这可以使用system.io.compression库吗?

修改

     using (FileStream zipToOpen = new FileStream(zipfile, FileMode.Open))
         {
           using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
                  {
                    ZipArchiveEntry readmeEntry = archive.CreateEntry("testFolder/");
                  }
         }

所以,使用这段代码,我可以在里面创建一个文件夹,但它里面没有任何文件。我现在的问题是我是否必须再次运行此代码才能将我的源文件夹中的每个文件都放到zip文件夹中,或者有更好的方法吗?

3 个答案:

答案 0 :(得分:6)

由于@stuartd,我设法找到了办法。他向我指出了这个答案https://stackoverflow.com/a/22339337/3182972,我找到了一种方法将其实现到我的代码中,该代码从所述目录的源位置创建包含文件的目录。

以下是代码:

   using (FileStream zipToOpen = new FileStream("c:\MyDestination\test.zip", FileMode.Open))
      {
        using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
          {
             ZipArchiveEntry readmeEntry;
             DirectoryInfo d = new DirectoryInfo(c:\MySourceFolder);
             FileInfo[] Files = d.GetFiles("*");
             foreach (FileInfo file in Files)
             {
               readmeEntry = archive.CreateEntryFromFile("c:\MySourceFolder"+ "\\" + file.Name, "MySourceFolder" + "/" + file.Name);
             }
          }
      }

所以我所做的就是去我的源目录并浏览那里的所有文件,并在foreach循环中将它们添加到zip文件中的目标文件夹中。

您还可以使用以下代码获取源目录名称:

string sourcepath = "C:\MySourceFolder";
int ind = sourcepath.LastIndexOf("\\") + 1;
string folderName = sourcepath.Substring(ind, folder.Length - ind);

答案 1 :(得分:1)

这可以通过以下方式执行:

var targetDir = @"D:\test";
var zipFile = @"D:\test.zip"; 
using (ZipArchive zipArchive = ZipFile.Open(zipFile, ZipArchiveMode.Read)) 
      zipArchive.AddDirectory(targetDir, "test");



public static class ExtensionMethods;
    {

        public static void AddDirectory(this ZipArchive zip, string targetDir, string subDir = null, CompressionLevel compressionLevel = CompressionLevel.Optimal)
        {
            var ogrDir = targetDir.Replace("/", "\\");
            if (!ogrDir.EndsWith("\\"))
                ogrDir = ogrDir + "\\";

            if (subDir == null)
                subDir = "";
            else
            {
                subDir = subDir.Replace("/", "\\");
                if (subDir.StartsWith("\\"))
                    subDir = subDir.Remove(0, 1);

                if (!subDir.EndsWith("\\"))
                    subDir = subDir + "\\";
            }
            Action<string> AddDirectoryAndSubs = null;
            AddDirectoryAndSubs = delegate (string _targetDir)
            {
                string[] files = Directory.GetFiles(_targetDir);
                foreach (string file in files)
                {
                    var fileInfo = new FileInfo(file);
                    zip.CreateEntryFromFile(fileInfo.FullName, subDir + (fileInfo.Directory.ToString() + "\\").Replace(ogrDir, "") + fileInfo.Name, compressionLevel);
                }

                string[] dirs = Directory.GetDirectories(_targetDir);
                foreach (string dir in dirs)
                    AddDirectoryAndSubs(dir);
            };

            AddDirectoryAndSubs(targetDir);
        }

    }

答案 2 :(得分:0)

此代码已准备就绪,可以在C#4.5及更高版本中使用System.IO.Copression(并使用子句)对其进行引用,这是对先前答案的改进。

    public static void AddDirToZip(string source, string targetzip)
    {
        using (FileStream zipToOpen = new FileStream(targetzip, FileMode.Open))
        {
            using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
            {
                ZipArchiveEntry readmeEntry;
                DirectoryInfo d = new DirectoryInfo(source);
                FileInfo[] Files = d.GetFiles("*");
                foreach (FileInfo file in Files)
                {
                    readmeEntry = archive.CreateEntryFromFile(file.FullName, d.Name + "/" + file.Name);
                }
            }
        }
    }