2011-11-29 78 views
1

一切工作正常..我可以解压缩文件,从一个Zip/RAR ..档案。 问题是,如何解压文件,那在目录从目录中解压一个文件

解压缩文件直接我使用(SharpZipLib):

FastZip fastZip = new FastZip(); 
fastZip.ExtractZip(source, targetDirectory, null); 

using (var fs = new FileStream(source, FileMode.Open, FileAccess.Read)) 
    using (var zf = new ZipFile(fs)) 
    { 
     var ze = zf.GetEntry("toc.out"); 
     if (ze == null) 
     { 
      throw new ArgumentException("toc.out", "not found in Zip"); 
     } 

     using (var s = zf.GetInputStream(ze)) 
     { 
      // do something with ZipInputStream 
     } 
    } 
} 

或用DotNetZip/ZipDotNet:

using (ZipFile zip = ZipFile.Read(source)) 
{ 
    ZipEntry e = zip["toc.out"]; 
    e.Extract(); 
} 

那不是工作,导致HES搜索在根文件.. 而且我也不会这样做:DirectoryName/toc.out 我该如何做到这一点?没有参数,我可以在其中包含所有子文件夹 - 用于搜索或类似的东西? :(

+0

[?使用SharpZipLib解压缩特定文件]中可能重复(http://stackoverflow.com/questions/328343/using-sharpziplib-to-unzip-specific-files) – samjudson

+0

不。我看到这个,他们直接解压缩文件,像我一样没有目录..... – eMi

回答

0

控制台。

希望有所帮助,你可以检查条目的名称的最后一部分,即使该文件是在子文件夹中,名称项将类似于“文件夹/文件。 ext“。 一个扩展方法可以实现SH这将是这样的:

public static ZipEntry GetEntryExt(this ZipFile file, string fileName) 
{ 
    foreach (ZipEntry entry in file) 
    { 
     if (entry.IsFile && entry.Name.EndsWith(Path.DirectorySeparatorChar + fileName)) 
      return entry; 
    } 

    return null; 
} 
+0

我用另一种方式使用FastZip,但这也可以工作,我会将回答标记为已回答,所以其他方式也知道它已完成 – eMi

+0

您可能希望小心不要返回“FooBar.txt “当您搜索”Bar.txt“时,请检查它是否完全匹配,或以”/Bar.txt“结尾。 – samjudson

+0

@samjudson,谢谢。我正在更新我的答案。 – tafa

1

可以编写一个LINQ表达发现在子文件夹中的文件如下所示

DirectoryInfo dirInfo = new DirectoryInfo(@"C:\"); 
foreach (var file in dirs.Select(dir => dir.EnumerateFiles().Where(i => i.Name.ToLower() == "wsdl.zip").FirstOrDefault()).Where(file => file != null)) 
{ 
    Console.WriteLine(file.ToString()); 
    Console.WriteLine(file.Length); 
} 

上面的代码中搜索在C驱动器的所有子文件夹中的文件wsdl.zip并打印它的名字和长度到

+0

这将是理念,但我不想先提取所有文件,然后搜索该文件..我想从存档中提取特定文件,该文件位于目录中。 – eMi

+0

如果您的文件位于相同的目录或固定位置,则可以直接读取该文件。除非您确定位置,否则我很难在没有加载文件的情况下进行搜索。我已经做了一个更改,使用更有效的EnumerateFiles。 – Rajesh