2014-04-04 82 views
4

我要合併2個大文件,但ATM後1個文件複製是否有更好的方式來報告進度我的代碼只更新進步,這是我的副本代碼ATMstream.copyto與進度條報告

max = files.Count; 
MessageBox.Show("Merge Started"); 
using (Stream output = File.OpenWrite(dest)) 
    { 
     foreach (string inputFile in files) 
     { 
      using (Stream input = File.OpenRead(inputFile)) 
      { 
       input.CopyTo(output); 
       count++; 
       progress = count * 100/max; 
       backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); 
      } 
     } 
    } 
MessageBox.Show("Merge Complete"); 

回答

6

你可以按塊讀取文件。

您應該在兩者之間通知BackgroundWorker

using (Stream output = File.OpenWrite(dest)) 
{ 
    foreach (string inputFile in files) 
    { 
     using (Stream input = File.OpenRead(inputFile)) 
     { 
      byte[] buffer = new byte[16 * 1024]; 

      int read; 
      while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
      { 
       output.Write(buffer, 0, read); 

       // report progress back 
       progress = (count/max + read/buffer.Length /* part of this file */) * 100; 
       backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); 
      } 

      count++; 
      progress = count * 100/max; 
      backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); 
     } 
    } 
} 
+0

我會嘗試感謝 – outlaw1994

+0

它不工作抓住了應用probaly導致我嘗試4個GB的文件合併make 1 8 gb文件 – outlaw1994

+0

@ outlaw1994:我合併了你的代碼和我的代碼。一探究竟。 –

3

這是我最後使用的感謝帕特里克幫助了很多的代碼

  List<string> files = new List<string>(); 
      if (file1 != null && file2 != null) 
      { 
       files.Add(file1); 
       files.Add(file2); 
      } 
      if (file3 != null) 
      { 
       files.Add(file3); 
      } 
      if (file4 != null) 
      { 
       files.Add(file4); 
      } 
        max = files.Count; 
        MessageBox.Show("Merge Started"); 
        using (Stream output = File.OpenWrite(dest)) 
        { 
         foreach (string inputFile in files) 
         { 
          using (Stream input = File.OpenRead(inputFile)) 
          { 
           byte[] buffer = new byte[32 * 1024]; 
           int read; 
           while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
           { 
            output.Write(buffer, 0, read); 
            count++; 
            // report progress back 
            progress = count * 100/read; 
            backgroundWorker2.ReportProgress(Convert.ToInt32(progress)); 
           } 
          } 
         } 
        } 
        MessageBox.Show("Merge Complete");