2011-03-10 56 views
2

我已經使用DotNetZip庫進行了一個快速測試,該庫打開一個完整的.bmp文件的zip文件並將它們轉換爲.jpg格式。DotNetZip - 讀到內存中

在此之前,我將所有文件寫入文件夾,轉換它們,保存jpg文件&然後刪除原來的bmp文件,這些文件變得混亂。

我不想在內存中先解壓縮它們,轉換爲jpg &然後保存。

該代碼有效,但並不那麼快。任何人都可以給我任何指示,我可以做些什麼來改善代碼嗎?另外,線程幫助?

string zipToUnpack = "c:\\test\\1000.zip"; 
string unpackDirectory = "c:\\temp\\"; 

string f = string.Empty; 
Bitmap bm; 
MemoryStream ms; 

using (ZipFile zip = ZipFile.Read(zipToUnpack)) 
{     
    foreach (ZipEntry e in zip) 
    { 
    if (e.FileName.ToLower().IndexOf(".bmp") > 0) 
    { 
     ms = new MemoryStream(); 
     e.Extract(ms); 
     try 
     { 
     bm = new Bitmap(ms);        
     f = unpackDirectory + e.FileName.ToLower().Replace(".bmp", ".jpg"); 
     bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg); 
     } 
     catch (Exception ex) 
     { 
     Console.WriteLine("File: " + e.FileName + " " + ex.ToString()); 
     } 
     ms.Dispose(); 
    } 
    } 
} 

由於

+1

什麼是緩慢的一部分? http://www.dijksterhuis.org/timing-function-performance-stopwatch-class/應該有助於找出答案。 – 2011-03-10 22:57:26

+0

感謝秒錶的東西。 它在1分鐘內轉換1000張圖像。我只是想知道是否有人有任何想法來改善整體設計。我很確定這是轉換爲JPG是慢的部分。 我不確定線程​​是否有幫助,或者即使我可以在這種情況下應用它? – StuffandBlah 2011-03-10 23:09:50

+0

我不明白你會如何應用線程。需要按順序讀取zip文件,因此如果沒有您首先解壓縮的初始解決方案,然後轉換,則無法在線程之間分配負載。即使如此,線程也是讓CPU做更多的工作。但是如果你的硬盤無法跟上,線程是沒有用的。 – 2011-03-10 23:34:53

回答

3

一般來說,DotNetZip是單線程。您可以在多個線程中打開多個歸檔,但每個歸檔只有一個線程。

如果你想登記多個CPU或核心,那麼我可以建議爲你將MemoryStream中的數據轉換爲jpg的部分調用QueueUserWorkItem。

對ZipEntry.Extract()的調用需要在同一個線程上對所有條目執行。這是因爲Zipfile爲所有讀訪問維護一個FileStream,並且多個線程提取條目將導致文件指針算術錯誤。

所以,這樣的事情:

public class State 
    { 
     public string FileName; 
     public MemoryStream stream; 
    } 

    public void Run() 
    { 
     string unpackDirectory = "c:\\temp\\"; 
     string zipToUnpack = "c:\\test\\1000.zip"; 

     var ConvertImage = new WaitCallback((o) => { 
       State s = o as State; 
       try 
       { 
        var bm = new Bitmap(s.stream); 
        var f = unpackDirectory + s.FileName.ToLower().Replace(".bmp", ".jpg"); 
        bm.Save(f, System.Drawing.Imaging.ImageFormat.Jpeg); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine("File: " + s.FileName + " " + ex.ToString()); 
       } 
      }); 


     using (ZipFile zip = ZipFile.Read(zipToUnpack)) 
     { 
      foreach (ZipEntry e in zip) 
      { 
       if (e.FileName.ToLower().IndexOf(".bmp") > 0) 
       { 
        var ms = new MemoryStream(); 
        e.Extract(ms); 
        ThreadPool.QueueUserWorkItem (ConvertImage, 
                new State { 
                 FileName = e.FileName, stream = ms } 
                });      
       } 
      } 
     } 
    } 
+0

Aw,shucks。樂意效勞。 – Cheeso 2011-03-24 23:54:25