2011-12-20 24 views
4

大きなテキストファイルを読み込み、指定した開始点と終了点からパーツを分割し、分割したデータを別のテキストファイルに保存する機能があります。ストリームを読み込むときにプログレスバーを追加し、別のファイルに分割したテキストを書き込むときに別のものを追加する必要があります.Ps.startとendはdatetimeを与えられます!!C#でテキストファイルの読み込み/書き込みを行う

using (StreamReader sr = new StreamReader(file,System.Text.Encoding.ASCII)) 
{ 
    while (sr.EndOfStream == false) 
    { 
     line = sr.ReadLine(); 

     if (line.IndexOf(start) != -1) 
     { 
      using (StreamWriter sw = new StreamWriter(DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + "cut")) 
      { 
       sw.WriteLine(line); 
       while (sr.EndOfStream == false && line.IndexOf(end) == -1) 
       { 
        line = sr.ReadLine(); 
        sw.WriteLine(line); 
       } 
      } 

      richTextBox1.Text += "done ..." + "\n"; 
      break; 
     } 
    } 
} 
+0

ご覧ください。 Silverlight、winforms、WPFについて話していますか? – peter

+2

もうひとつ考えなければならないことは、プログレスバーが0から始まり100になるかどうかということです。その場合は、ファイルの行数を調べて、進捗状況を正確に報告できるようにする必要があります。 – peter

+0

これはwinformです – user1096252

答えて

10

ファイルは、FileInfoオブジェクトを使用しているどのくらい動作するようになり最初に行うべきこと、

http://msdn.microsoft.com/en-us/library/system.io.fileinfo.aspx

FileInfo fileInfo = new FileInfo(file); 
long length = fileInfo.Length; 

私はあなたがこのようにそれを行うことをお勧め、

private long currentPosition = 0; 

private void UpdateProgressBar(int lineLength) 
{ 
    currentPosition += line.Count; // or plus 2 if you need to take into account carriage return 
    progressBar.Value = (int)(((decimal)currentPosition/(decimal)length) * (decimal)100); 
} 

private void CopyFile() 
{ 
    progressBar.Minimum = 0; 
    progressBar.Maximum = 100; 

    currentPosition = 0; 

    using (StreamReader sr = new StreamReader(file,System.Text.Encoding.ASCII)) 
    { 
     while (sr.EndOfStream == false) 
     { 
      line = sr.ReadLine(); 
      UpdateProgressBar(line.Length); 

      if (line.IndexOf(start) != -1) 
      { 
       using (StreamWriter sw = new StreamWriter(DateTime.Now.ToString().Replace("/", "-").Replace(":", "-") + "cut")) 
       { 
        sw.WriteLine(line); 
        while (sr.EndOfStream == false && line.IndexOf(end) == -1) 
        { 
         line = sr.ReadLine(); 
         UpdateProgressBar(line.Length); 
         sw.WriteLine(line); 
        } 
       } 

       richTextBox1.Text += "done ..." + "\n"; 
       break; 
      } 
     } 
    } 
} 

これは、読み込まれたファイルの割合を計算し、プロを設定していますgress barをその値に設定します。次に長さが長いかどうか心配する必要はなく、プログレスバーはintを使用します。

あなたが値を切り捨てしたくない場合は、この(上記のint型にキャストすると、常に小数点を切り捨て、ひいては切り捨てます)、

progressBar.Value = (int)Math.Round(((decimal)currentPosition/(decimal)length) * (decimal)100), 0); 

は、バックグラウンドスレッドでこのですか?あなたがthis.Invokeを呼び出す必要があることを忘れないでください。プログレスバーを更新するには、クロススレッドの例外が発生します。

+0

これは大丈夫だと思われますが、これは始まりを検索するときだけでなく、何かを覚えていないときにのみ動作すると思いますか? – user1096252

+0

fileInfo.Lengthは長くなければならず、progressBar.Maximumはint型でなければなりません動作しないでしょう。 – user1096252

+0

最小値を0に、最大値を100にして計算を行い、それを丸めることができます。私は答えを更新します。 – peter

関連する問題