2

我正在使用 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 添加文件而不创建文件夹),但我想知道是否可以对标准库做同样的事情。

4

1 回答 1

0

您似乎认为该文件将被添加到存档中,但事实并非如此。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上面的代码将在根目录和源文件的内容中创建一个存档,而不需要任何其他目录。

于 2018-11-27T17:32:39.333 回答