ZipArchive.CreateEntryFromFile不显示新条目

时间:2016-04-05 17:01:44

标签: c# .net-4.5

我在这里遇到一个奇怪的问题,不太清楚我错过了什么。我运行下面的代码,它确实创建了一个.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);
    }
}

2 个答案:

答案 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);