【问题标题】:SharpLibZip: Add file without pathSharpLibZip:添加没有路径的文件
【发布时间】:2008-10-13 17:04:34
【问题描述】:

我正在使用以下代码,使用 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();
}

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

【问题讨论】:

    标签: compression sharpziplib


    【解决方案1】:

    我的解决方案是将ZipFileNameTransform 对象属性设置为ZipNameTransform,并将其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 属性的类型为 INameTransform,允许自定义名称转换。

    【讨论】:

    • 完美,这正是我想要的。谢谢!
    • 是的,这里也一样——正是我需要的。谢谢!
    • 非常感谢。经过这么多的努力,我可以解决我的问题。
    【解决方案2】:

    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();
    }
    

    【讨论】:

    • 在按名称添加文件时,ZipFile.Add() 的 entryName 参数没有重载,但我喜欢你的想法。请参阅下面的答案。
    • 你有最新版本的库吗?它确实对 file.add 有重载
    • 我很确定有,至少在最新版本中是这样。
    • 我自己今天也遇到了同样的问题,将我的库更新到最新版本,用于重载 Add 并且效果很好。
    【解决方案3】:

    Directory.GetFiles() 的 MSDN 条目指出 返回的文件名附加到提供的路径参数。 (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();
    }
    

    【讨论】:

    • 是的,如果您从要添加的文件路径中排除目录,则 Add 方法将找不到该文件。请参阅下面的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-17
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多