2015-07-21 74 views
1

我正在使用c#fw4.5。 我有一个简单的代码解压zip文件。c#提取目录下的zip文件

foreach(ZipArchiveEntry entry in z.entries) //z is a zip file open in ZipArchiveMode.Read 
{ 
     entry.ExtractToFile(entry.FullName); 
} 

zip文件里面有一个目录,所有文件都在该目录内。 当我看到z.Entries时,我看到它的一个数组,其中[0]只是目录,[1],[2],[3]是文件。 但是当它尝试做:

entry.ExtractToFile(entry.FullName);

在第一个条目上,出现错误: “文件名,目录名称或卷标语法不正确”。

我似乎无法找出最新的错误。我是否也需要任何东西来打开目录?也许因为条目是一个目录只有“ExtractToFile(entry.FullName)”不能工作?

谢谢先进。

+0

当你运行它时,entry.FullName的值是什么?我的猜测是它是一个invliad绝对路径,或者它展开到一个无效的相对路径。根据ZipArchiveEntry.ExtractToFile()的文档,“允许路径指定相对或绝对路径信息,相对路径信息被解释为相对于当前工作目录。” – Taegost

回答

1

根据this MSDN articleExtractToFile方法需要一个文件路径(带有扩展名),并且如果指定了目录,将会抛出一个ArgumentException

由于存档中的第一个条目是一个目录,并且您将其名称用作参数,因此您有此问题。

查找到相关ExtractToDirectory方法,它是用来像这样:

ZipFile.ExtractToDirectory(@"c:\zip\archive.zip", @"c:\extract\"); 
-1

更换你的路:

void Main() 
{ 
    var zipPath = @"\\ai-vmdc1\RedirectedFolders\jlambert\Downloads\cscie33chap1and2.zip"; 
    var extractPath = @"c:\Temp\extract"; 

    using (ZipArchive z = ZipFile.OpenRead(zipPath)) 
    { 
     foreach(ZipArchiveEntry entry in z.Entries) //z is a zip file open in ZipArchiveMode.Read 
     { 
      entry.ExtractToFile(Path.Combine(extractPath, entry.FullName), true); 
     } 
    } 
} 
0

除了Tonkleton的答案,我会建议你使用第三方压缩库,因为ZipArchive在.Net 4.5框架之前不支持框架版本,所以我可以建议DotNetZip,正如其他有关StackOverflow早期框架压缩的问题所述。

+0

当他说:“我正在使用c#fw4.5。”时,这与此有关吗?如果你这么想,请告诉我们。 – jacoblambert

+1

如果您不想使用便携式代码,则不相关。 – gh0st

+0

很酷 - 谢谢。 – jacoblambert