不包含文件夹的 Zip 文件

Zip files without inclusion of folders

我正在使用 System.IO.Compression 将文件压缩成 .zip,在源代码下方:

using (FileStream zipToOpen = new FileStream(zipName, FileMode.CreateNew)){
  using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update)){
    ZipArchiveEntry readmeEntry = archive.CreateEntry(@"C:\Users\soc\myFold\someFile.xml");
  }
}

这段代码运行良好,但不幸的是在 .zip 中有整个文件夹序列 (C: -> Users -> ... -> someFile.xml);我可以获得仅包含我需要的文件的最终 .zip 文件吗?我知道对于其他库,这个事实是可能的 (DotNetZip add files without creating folders),但我想知道是否可以对标准库做同样的事情。

您的印象似乎是文件将被添加到存档中,但事实并非如此。 CreateEntry只是创建了一个指定路径和条目名称的条目,您还需要编写实际文件。
事实上,你问题中的代码与文档中的代码非常相似,所以我假设你是从那里得到的?

无论如何,要仅获取文件名,您可以使用 Path.GetFileName 然后您可以将实际文件内容写入 zip 条目。

var filePath = @"C:\temp\foo.txt";
var zipName = @"C:\temp\foo.zip";

using (FileStream zipToOpen = new FileStream(zipName, FileMode.CreateNew))
{
    using (ZipArchive archive = new ZipArchive(zipToOpen, ZipArchiveMode.Update))
    {
        ZipArchiveEntry readmeEntry = archive.CreateEntry(Path.GetFileName(filePath));
        using (StreamReader reader = new StreamReader(filePath))
        using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
        {
            writer.Write(reader.ReadToEnd());
        }
    }
}

上面的代码将在根目录中创建一个 foo.txt 的存档,其中包含源文件的内容,没有任何其他目录。