2011-11-29 81 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