2014-08-29 80 views
1

我有需要搜索的zip文件我有使用System.IO.Compression的.NET 4.5的工作代碼,它的工作原理完美,但似乎無法使其工作在.NET 3.5.NET 3.5 DotNetZip通過提取的文件進行搜索

這裏使用DotNetZip是我的代碼

di = new DirectoryInfo(sFullLogPath + "\\"); 
       files = di.GetFiles(sExtension); 
       logs.Info("Searching " + sType + " logs on " + sDate + " for " + sSearchTerm); 
       Console.WriteLine(""); 
       try 
       { 
        foreach(var file in files) 
        { 
         //Console.WriteLine(file.FullName); 
         using (ZipFile archive = ZipFile.Read(sFullLogPath + "\\" + file.Name)) 
         { 
          foreach(var entry in archive) 
          { 
           if(entry.FileName.EndsWith(".ininlog",StringComparison.OrdinalIgnoreCase)) 
           { 
            //Console.WriteLine(entry.FileName); 
            try 
            { 
             Directory.CreateDirectory(sTemp); 
             entry.Extract(Path.Combine(sTemp, entry.FileName)); 
             Stream streamTemp = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
             StreamReader streamReader = new StreamReader(streamTemp); 
             string line; 
             while ((line = streamReader.ReadLine()) != null) 
             { 
              if (line.Contains(sSearchTerm)) 
              { logs.Info("{0} contains \"{1}\"", file.Name, sSearchTerm); break; } 
              else 
              { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} does not contain \"{1}\"", file.Name, sSearchTerm); Console.ResetColor(); break; } 
             } 
            } 
            catch (UnauthorizedAccessException ae) 
            { 
             logs.Error(ae.Message); 
            } 
            catch (SystemException se) 
            { 
             logs.Error(se.Message); 
            } 
            catch (ApplicationException ape) 
            { 
             logs.Error(ape.Message); 
            } 
            catch (Exception e) 
            { 
             logs.Error(e.Message); 
            } 
            finally 
            { 
             Directory.Delete(sTemp, true); 
             archive.Dispose(); 
            } 
           } 
          } 
         } 
        } 
       } 
       catch (UnauthorizedAccessException ae) 
       { 
        logs.Error(ae.Message); 
       } 
       catch (SystemException se) 
       { 
        logs.Error(se.Message); 
       } 
       catch (ApplicationException ape) 
       { 
        logs.Error(ape.Message); 
       } 
       catch (Exception e) 
       { 
        logs.Error(e.Message); 
       } 

預期的行爲:

目錄中的每一個壓縮文件解壓縮到一個臨時位置,然後進行搜索,看是否字符串是在文件,如果找到它會輸出f的名字ILE它在

發現

當前的行爲:

沒有找到和引用到我要找的字符串,即使我知道它的存在,它在同一文件上工作正常與.NET 4.5版本

我爲什麼不使用.NET 4.5,我們有我們的服務器上的定製軟件,目前擁有與.NET 4.5 .NET 4.5 Version using System.IO.Compression .NET 3.5 Version Using DotNetZip

感謝@Thomas固定編碼的問題 - 看起來像其他人造成此假積極的

else { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} does not contain \"{1}\"", file.Name, sSearchTerm); Console.ResetColor(); break; } 

這裏是固定的代碼

di = new DirectoryInfo(sFullLogPath + "\\"); 
       files = di.GetFiles(sExtension); 
       logs.Info("Searching " + sType + " logs on " + sDate + " for " + sSearchTerm); 
       Console.WriteLine(""); 
       try 
       { 
        foreach(var file in files) 
        { 
         //Console.WriteLine(file.Name); 
         using (ZipFile archive = ZipFile.Read(file.FullName)) 
         { 
          foreach(var entry in archive) 
          { 
           if(entry.FileName.EndsWith(".ininlog", StringComparison.OrdinalIgnoreCase)) 
           { 
            try 
            { 
             using (var tempStream = entry.OpenReader()) 
             using (var streamReader = new StreamReader(tempStream)) 
             { 
              string line; 
              while ((line = streamReader.ReadLine()) != null) 
              { 
               if(line.Contains(sSearchTerm)) 
               { 
                logs.Info("{0} contains \"{1}\"", file.Name, sSearchTerm); 
                break; 
               } 
              } 
             } 
            } 
            catch (UnauthorizedAccessException ae) 
            { 
             logs.Error(ae.Message); 
            } 
            catch (SystemException se) 
            { 
             logs.Error(se.Message); 
            } 
            catch (ApplicationException ape) 
            { 
             logs.Error(ape.Message); 
            } 
            catch (Exception e) 
            { 
             logs.Error(e.Message); 
            } 
            finally 
            { 
             archive.Dispose(); 
             //Directory.Delete(sTemp + "\\" + entry.FileName); 
            } 
           } 
          } 
         } 
        } 
       } 
       catch (UnauthorizedAccessException ae) 
       { 
        logs.Error(ae.Message); 
       } 
       catch (SystemException se) 
       { 
        logs.Error(se.Message); 
       } 
       catch (ApplicationException ape) 
       { 
        logs.Error(ape.Message); 
       } 
       catch (Exception e) 
       { 
        logs.Error(e.Message); 
       } 
       finally 
       { 
        // 
       } 
       break; 
+0

你應該調試你的代碼,並找出問題是否與壓縮/解壓部分或搜索。也看起來像Thomas Levesque答案顯示的問題(當你試圖搜索ZIP文本文件的字符串)。 – 2014-08-29 20:02:44

回答

4

你在這裏打開了錯誤的文件:

Stream streamTemp = new FileStream(file.FullName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 

file是ZIP文件,而不是你剛纔解壓的文件。

順便說一句,我不認爲你需要提取的文件,DotNetZip 可能 允許你直接編寫未壓縮的流。


編輯:我剛纔檢查:您可以使用OpenReader方法得到一個流,讀條目的壓縮內容。只需在該流的周圍創建StreamReader;不需要實際提取文件。

... 
try 
{ 
    using (var stream = entry.OpenReader()) 
    using (var reader = new StreamReader(stream)) 
    { 
     string line; 
     while ((line = streamReader.ReadLine()) != null) 
     { 
      if (line.Contains(sSearchTerm)) 
      { logs.Info("{0} contains \"{1}\"", file.Name, sSearchTerm); break; } 
      else 
      { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} does not contain \"{1}\"", file.Name, sSearchTerm); Console.ResetColor(); break; } 
     } 
    } 
} 
... 
+0

我不想在流中運行它,因爲日誌所在的服務器正在生產中,而我試圖限制大部分日誌中使用的內存/資源都是2 GB,這就是爲什麼我要解壓縮到一個臨時位置 – ondrovic 2014-08-29 21:26:20

+1

@ondrovic,直接從zip中讀取流不會將整個文件加載到內存中;當你讀取數據流時,數據是未壓縮的,並且不會保存在內存中(除了StreamReader緩衝區中的部分,但通常很小) – 2014-08-29 21:48:53

+0

我想我並不關注你能否提供一個如何做你在說什麼? – ondrovic 2014-08-29 21:59:39