16

我正在使用以下代码,使用SharpZipLib库将文件添加到 .zip 文件,但每个文件都以其完整路径存储。我只需要将文件存储在 .zip 文件的“根目录”中。

string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
     zipFile.BeginUpdate();
     foreach (string file in files)
     {
          zipFile.Add(file);
     }
     zipFile.CommitUpdate();
}

我在提供的文档中找不到有关此选项的任何信息。由于这是一个非常受欢迎的图书馆,我希望阅读此书的人可能会有所了解。

4

3 回答 3

24

我的解决方案是将 的NameTransform对象属性设置ZipFile为 aZipNameTransform并将其TrimPrefix设置为文件的目录。这会导致条目名称的目录部分(即完整文件路径)被删除。

public static void ZipFolderContents(string folderPath, string zipFilePath)
{
    string[] files = Directory.GetFiles(folderPath);
    using (ZipFile zipFile = ZipFile.Create(zipFilePath))
    {
        zipFile.NameTransform = new ZipNameTransform(folderPath);
        foreach (string file in files)
        {
            zipFile.BeginUpdate();
            zipFile.Add(file);
            zipFile.CommitUpdate();
        }
    }
}

很酷的是 NameTransform 属性是 type INameTransform,允许自定义名称转换。

于 2008-10-14T12:11:13.730 回答
12

System.IO.Path.GetFileName()与 ZipFile.Add() 的 entryName 参数结合使用怎么样?

string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
     zipFile.BeginUpdate();
     foreach (string file in files)
     {
          zipFile.Add(file, System.IO.Path.GetFileName(file));
     }
     zipFile.CommitUpdate();
}
于 2008-10-13T17:12:29.537 回答
4

MSDN 条目Directory.GetFiles()表示返回的文件名附加到提供的路径参数。http://msdn.microsoft.com/en-us/library/07wt70x2.aspx),因此您传递的字符串zipFile.Add()包含路径。

根据 SharpZipLib 文档,Add 方法有一个重载,

public void Add(string fileName, string entryName) 
Parameters:
  fileName(String) The name of the file to add.
  entryName (String) The name to use for the ZipEntry on the Zip file created.

试试这个方法:

string[] files = Directory.GetFiles(folderPath);
using (ZipFile zipFile = ZipFile.Create(zipFilePath))
{
     zipFile.BeginUpdate();
     foreach (string file in files)
     {
          zipFile.Add(file, Path.GetFileName(file));
     }
     zipFile.CommitUpdate();
}
于 2008-10-13T17:12:40.940 回答