1

テキストファイルの読み書きに使用するコードは次のとおりです。

StreamWriter sw1 = new StreamWriter("DataNames.txt");
sw1.WriteLine(textBox1.Text);
sw1.Close();
StreamWriter sw2 = new StreamWriter("DataNumbers.txt");
sw2.WriteLine(textBox2.Text);
sw2.Close();
FileInfo file1 = new FileInfo("DataNames.txt");
StreamReader sr1 = file1.OpenText();
while (!sr1.EndOfStream)
{
    listBox1.Items.Add(sr1.ReadLine());
}
FileInfo file2 = new FileInfo("DataNumbers.txt");
StreamReader sr2 = file2.OpenText();
while (!sr2.EndOfStream)
{
    listBox2.Items.Add(sr2.ReadLine());
}

問題は、ボタンをクリックしてテキストボックスからテキストファイルにデータを保存すると、「プロセスはファイル 'C:\xxxx\xxxxxx\xxxxx\xxxx\xxxxx\xxxxx.txt' にアクセスできません」というエラーが表示されることです。別のプロセスで使用されています。」

このエラーが発生した理由を教えてください。修正を手伝ってください。

4

6 に答える 6

4

usingストリームの周りにステートメントを追加してみてください。Disposedそれ以外の場合、ファイルはまだストリームにロックされています

例:

   //Write
    using (StreamWriter sw1 = new StreamWriter("DataNames.txt"))
    {
        sw1.WriteLine(textBox1.Text);
    }

    using (StreamWriter sw2 = new StreamWriter("DataNumbers.txt"))
    {
        sw2.WriteLine(textBox2.Text);
    }


    // Read
    foreach (var line in File.ReadAllLines("DataNames.txt"))
    {
        listBox1.Items.Add(line);
    }

    foreach (var line in File.ReadAllLines("DataNumbers.txt"))
    {
        listBox2.Items.Add(line);
    }
于 2013-01-09T20:57:44.187 に答える
3

ファイルを読んだ後、ファイルを閉じていないようです。FileInfo.OpenTextを呼び出した後、 CloseメソッドStreamReaderを介して、またはステートメントを使用して閉じる必要がある を取得します。using

しかし、それをすべて行うメソッドが既にあります。 File.WriteAllTextFile.AppendAllText、およびFile.ReadAllLinesメソッドを見てください。

于 2013-01-09T20:54:21.860 に答える
1

StreamReader オブジェクトが不要になったら、Closeする必要があります。これにより、この問題が修正されます。いえ

StreamReader sr1 = file1.OpenText();
try {
            while (!sr1.EndOfStream)
            {
                listBox1.Items.Add(sr1.ReadLine());
            }
}
finally { 
  sr1.Close();
}
            FileInfo file2 = new FileInfo("DataNumbers.txt");
            StreamReader sr2 = file2.OpenText();
try {
            while (!sr2.EndOfStream)
            {
                listBox2.Items.Add(sr2.ReadLine());
            }
}
finally {
  sr2.Close();
}
于 2013-01-09T20:53:56.543 に答える
1

ファイルを開いていますが、閉じていません。

StreamReader sr1 = file1.OpenText();
StreamReader sr2 = file2.OpenText();
于 2013-01-09T20:54:04.267 に答える
1

ストリーム リーダーを閉じていないため、問題が発生します。

外部リソース (この場合はファイル) を使用するより安全な方法は、それらの使用をusingステートメントに埋め込むことです。ステートメントは、ステートメント ブロックのusing最後で、またはステートメント ブロックが別の方法で残っている場合に、リソースを自動的に閉じます。たとえば、これはreturnステートメントまたは例外である可能性があります。例外が発生した後でも、リソースが閉じられることが保証されます。

usingインターフェイスを実装する任意のオブジェクトにステートメントを適用できIDisposableます。

// Writing to the files
using (var sw1 = new StreamWriter("DataNames.txt")) {
    sw1.WriteLine(textBox1.Text);
}
using(var sw2 = new StreamWriter("DataNumbers.txt")) {
    sw2.WriteLine(textBox2.Text);
}

// Reading from the files
FileInfo file1 = new FileInfo("DataNames.txt");
using (StreamReader sr1 = file1.OpenText()) {
    while (!sr1.EndOfStream) {
        listBox1.Items.Add(sr1.ReadLine());
    }
}
FileInfo file2 = new FileInfo("DataNumbers.txt");
using (StreamReader sr2 = file2.OpenText()) {
    while (!sr2.EndOfStream)
    {
        listBox2.Items.Add(sr2.ReadLine());
    }
}

ただし、このように読み取り部分を簡略化できます

// Reading from the files
listBox1.Items.AddRange(File.ReadAllLines("DataNames.txt"));
listBox2.Items.AddRange(File.ReadAllLines("DataNumbers.txt"));
于 2013-01-09T21:00:55.450 に答える
0

私は以前にこの動作を見たことがあります-通常、ファイルアクセスをブロックしている別のプロセスが開いています。タスクバーで複数の開発サーバーを開いていますか?(奇妙な、はい、しかし私はそれが起こるのを見ました)

于 2013-01-09T20:55:00.030 に答える