我在这里遇到一个奇怪的问题,不太清楚我错过了什么。我运行下面的代码,它确实创建了一个.zip文件,我看到大小从0KB增加到8,992KB。但是,当我打开.zip文件时,我看不到任何文件。如果我尝试从资源管理器“提取全部...”,它会显示“Windows无法完成提取”,因为.zip文件“无效”。知道我做错了什么吗?
if (File.Exists(ZipName))
File.Delete(ZipName);
using (ZipArchive archive = ZipFile.Open(ZipName, ZipArchiveMode.Create))
{
foreach (string sFileName in FileNames)
{
archive.CreateEntryFromFile(sFileName,sFileName,CompressionLevel.Optimal);
}
}
答案 0 :(得分:0)
我遇到了同样的问题,我发现了一个解决方案。事实证明,我正在为文件提供两个文件名参数的完整路径,如下所示:
// This gets a list of files with their full paths
var fileList = Directory.GetFiles(_outputDir, "*.txt");
foreach (var file in fileList)
{
archive.CreateEntryFromFile(file, file, CompressionLevel.Optimal);
}
这给了我同样的问题 - 一个空的zip文件,这是无效的。 (据说,我的文件路径不长 - 它们是C:\Results\[some_guid].txt
。)
解决方案是将文件作为FileInfo对象获取,然后对于第一个参数使用完整路径,对于第二个参数,只使用文件名,如下所示:
// This gets a set of FileInfo objects, with a FullName property that is
// the full path to the file, and a Name property that is just the file name.
var directoryInfo = new DirectoryInfo(_outputDir);
var fileList = directoryInfo.GetFiles("*.txt");
foreach (var file in fileList)
{
archive.CreateEntryFromFile(file.FullName, file.Name, CompressionLevel.Optimal);
}
这最终完美地运作了。如果我打开zip文件,文件就在那里。如果我提取它,提取工作,文件似乎是有效的。
答案 1 :(得分:0)
您需要从entryName中删除驱动器号,这是CreateEntryFromFile()的第3个参数。
所以而不是
archive.CreateEntryFromFile(sFileName, sFileName, CompressionLevel.Optimal);
使用
archive.CreateEntryFromFile(sFileName, sFileName.Substring(3), CompressionLevel.Optimal);