2017-02-16 7 views
1

私はUniの割り当てのためにプロジェクトのWindowsフォームを作成しています。名前と姓が一致する場合は、すでに作成されたテキストファイルを検索して名前と姓を一致させたいと考えています。私はコードを構築してエラーを表示していませんが、実行して情報を追加しようとすると、次のプロセスが本質的にエラーとなります(Streamreaderのライターは、別のプロセスによって既に使用されているため、私はこのプロセスがstreamreaderであると仮定し、私は無駄に読み込みを停止するようにコード化しようとしました。私は最初の3ヶ月間コーディングを学んでおり、できるだけ助けていただければ幸いです。下に私のコードのスニペットを入れました。c#ストリームリーダを終了する方法

//check if there is a file with that name 
     if (File.Exists(sFile)) 
     { 

      using (StreamReader sr = new StreamReader(sFile)) 
      { 
       //while there is more data to read 
       while (sr.Peek() != -1) 
       { 
        //read first name and last name 
        sFirstName = sr.ReadLine(); 
        sLastName = sr.ReadLine(); 
       } 
       { 
        //does this name match? 
        if (sFirstName + sLastName == txtSearchName.Text) 

         sr.Close(); 
       } 

       //Process write to file 
        using (StreamWriter sw = new StreamWriter(sFile, true)) 

         { 
          sw.WriteLine("First Name:" + sFirstName); 
          sw.WriteLine("Last Name:" + sLastName); 
          sw.WriteLine("Gender:" + sGender); 
         } 
+0

ここでは、StreamReaderの閉じ括弧があります。 usingディレクティブはstreamreaderを破棄し、ファイルのロックを解除しますが、ライターを開いた後でなければ閉じていないかのように見えますか? – Wheels73

+0

入力ファイルを読み込んで一時ファイルに書き込み、入力ファイルを一時ファイルで圧縮します。 –

+0

コードのこの部分が実行されていますか?同時に、同じファイルを読み書きしようとしているようです。 –

答えて

1

同じファイルを使用して、リーダー内でライターを使用しています。 usingは、中括弧の後ろにオブジェクトを配置します。

using(StreamReader reader = new StreamReader("foo")){ 
//... some stuff 
    using(Streamwriter writer = new StreamWriter("foo")){ 
    } 
} 

ので、同じように行います:usingステートメントに関する私のコメントを1として

using(StreamReader reader = new StreamReader("foo")){ 
//... some stuff 
} 

using(Streamwriter writer = new StreamWriter("foo")){ 
} 
1

。 次のように並べ替えます。私は地元でテストしたところ、うまくいくようです。

using (StreamReader sr = new StreamReader(sfile)) 
    { 
     //while there is more data to read 
     while (sr.Peek() != -1) 
     { 
      //read first name and last name 
      sFirstName = sr.ReadLine(); 
      sLastName = sr.ReadLine(); 

      //does this name match? 
      if (sFirstName + sLastName == txtSearchName.Text) 
       break; 
     } 
    } 

    using (StreamWriter sw = new StreamWriter(sfile, true)) 
    { 
     sw.WriteLine("First Name:" + sFirstName); 
     sw.WriteLine("Last Name:" + sLastName); 
     sw.WriteLine("Gender:" + sGender); 
    } 

私はsr.Closeをbreakステートメントに置き換えて終了しました。リーダーを閉じると、それが閉じているときにエラーが表示されます。

また、私はあなたが性別を設定していないことに気付きましたか?それが他の場所に設定されていない限り。 役に立ったと思っています。

+0

こんにちは皆さん、助けてくれてありがとう、私は性別を削除しました。もはや必要ありません。私はこのコードを使用するときに問題が残っています。 "壊れたり閉じないループを囲むことはできません" –

+0

奇妙な..まだ私のために働く..あなたは休憩がないと確信していますか?中括弧{}の外の文? – Wheels73

0

FileStreamを使用できます。ファイルを扱う多くのオプションが用意されています:

var fileStream = new FileStream("FileName", FileMode.Open, 
FileAccess.Write, FileShare.ReadWrite); 


var fileStream = new FileStream("fileName", FileMode.Open, 
FileAccess.ReadWrite, FileShare.ReadWrite); 
0

私はこれがあなたが欲しい/必要とするものだと思います。あなたはそれをしようとしている方法でファイルに追加することはできません。代わりに、入力ファイルを読んで、読んでいる間に一時ファイルを書きたいと思うでしょう。そして、あなたの行があなたの要件に合っているときはいつでも、変更を加えて行を書くことができます。

 string inputFile = "C:\\temp\\StreamWriterSample.txt"; 
     string tempFile = "C:\\temp\\StreamWriterSampleTemp.txt"; 

     using (StreamWriter sw = new StreamWriter(tempFile))//get a writer ready 
     { 
      using (StreamReader sr = new StreamReader(inputFile))//get a reader ready 
      { 
       string currentLine = string.Empty; 
       while ((currentLine = sr.ReadLine()) != null) 
       { 
        if (currentLine.Contains("Clients")) 
        { 
         sw.WriteLine(currentLine + " modified"); 
        } 
        else 
        { 
         sw.WriteLine(currentLine); 
        } 
       } 
      } 
     } 

     //now lets crush the old file with the new file 
     File.Copy(tempFile, inputFile, true); 
+0

私は、ファイルに書き込まれた入力の6行でクライアントの詳細の入力を可能にするwindowsフォームを持っています。私はフォームの別の部分に別のマシンで実行された運動の分のチェックボックスを含んでいます。私は検索ボックスとボタンを持っています。クライアントの名前と姓のために現在のファイルを検索しようとしています。検索ボックス "が存在する場合は新しい分情報を追加します。アクティビティが実行された日を選択するラジオボタンがあります。したがって、ファイルを追加するか、上書きせずに新しい行を追加する必要があります。どのような変更が必要ですか? –

+0

あなたはアプローチを完全に再考し、少なくともデータベースまたはXMLファイルを使用する必要があります。テキストファイルをデータベースであるかのように読み書きして比較すると、パフォーマンスが非常に悪くなります。しかし、自分のシナリオで自分のコードを動作させるには、ifステートメントを試してみてください。しかし、あなたは3行を修正する必要があります... 3つの別々の要素の検索を実行するか、それを一度実行し、名前を見つけたら次の2行は必然的に姓と性別であると仮定します。どちらの場合でも、更新を行うたびに_database_を書き直すことになります。 –

関連する問題