2016-04-23 7 views
1

私はいくつかのファイルを暗号化しようとしていますが、うまくいきますが、100mb-1gbファイルのように大きなファイルがどのくらい離れているかを示すプログレスバーを表示しようとすると、非常に遅いです。 ReportProgressがすぐに呼び出されていると仮定しているので、2秒ごとに更新するようにストップウォッチを追加しましたが、これは非常に高速に動作しました(まだreportProgressを呼び出すことなく速く動作しませんでした)まったく。CryptoStream ReportProgress ProgressBar C#

using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create)) 
      { 
       using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        using (FileStream fsIn = new FileStream(inputFile, FileMode.Open)) 
        { 
         int data; 
         int test = 0; 
         Stopwatch stopw = new Stopwatch(); 
         stopw.Start(); 
         while ((data = fsIn.ReadByte()) != -1) 
         { 
          cs.WriteByte((byte) data); 
          test++; 
          if (stopw.Elapsed.Seconds > 2) 
          { 
           stopw.Reset(); 
           backgroundWorker1.ReportProgress((int) fsIn.Length); 

          } 
         } 
         stopw.Stop(); 
        } 
       } 
      } 

例はbackgroundWorker1.ReportProgress((int) fsIn.Length);行でファイルが5秒を取ることができます削除されますが、それはで追加して、それが20秒を取って終わるということです。

これを改善してより速くするにはどうすればよいですか?

答えて

1

私の提案は、ストップウォッチを使用せずに#バイトだけを使うことです。たぶん、すべてのバイトが長い時間がかかった後に経過したストップウォッチをチェックしているかもしれません(しかし、誰も知っているとは思われません)。また、whileループの外側でfsIn.Lengthを1回取得します。

using (FileStream fsCrypt = new FileStream(cryptFile, FileMode.Create)) 
{ 
    using (CryptoStream cs = new CryptoStream(fsCrypt, AES.CreateEncryptor(), CryptoStreamMode.Write)) 
    { 
     using (FileStream fsIn = new FileStream(inputFile, FileMode.Open)) 
     { 
      int data; 
      long test = 0; 
      long total = fsIn.Length; 
      while ((data = fsIn.ReadByte()) != -1) 
      { 
       cs.WriteByte((byte) data); 
       test++; 
       if (test % 10000 == 0) 
       { 
        backgroundWorker1.ReportProgress((int) (test * 100/total)); 

       } 
      } 
     } 
    } 
} 

はまた、あなたのReportProgressイベントハンドラのコードは犯人ではないことを確認してください。あなたはそこで何か高価なことをしたくない。

+0

これはうまくいくはずですが、プログレスバーがまったく変化していないと思われます。0% – jLynx

+0

oops、test is int ....レポートの進捗パラメータを '(int)(test * 100 /合計) ' – bpursley

+0

それは約1/4の方法でそれに失敗します' '-34'の値は '値'のために有効ではありません。 「値」は「最小値」と「最大値」の間である必要があります。 – jLynx

関連する問題