我正在使用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),但是我想知道是否可以对标准库进行同样的操作。
答案 0 :(得分: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
,源文件的内容为该目录,没有任何其他目录。