0

VS2012 と Windows 8 を使用して単純な Windows アプリケーションを作成しています。ユーザーがテキストを入力するリッチ テキスト ボックスがあり、フォームを閉じると、リッチテキスト ボックスのテキストがファイルに保存されます。ただし、ほとんどの場合、アプリケーションは「別のプロセスで使用されているため、プロセスはファイルにアクセスできません」というエラーをスローしています。コードは次のとおりです。

 public Form1()
    {
        InitializeComponent();

        try
        {
            richTextBox1.LoadFile("D:\\MyNotes\\MyNotes.rtf");
        }
        catch (Exception ex)
        {

            System.IO.File.Create("D:\\MyNotes\\MyNotes.rtf");
        }
    }
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {


        try
        {

            System.IO.StreamWriter SW = new System.IO.StreamWriter(
            "D:\\MyNotes\\MyNotes.rtf", false, Encoding.ASCII);
            SW.Write(richTextBox1.Text);
            SW.Close();

                            //Even this does not work
            // richTextBox1.SaveFile("D:\\MyNotes\\MyNotes.rtf");


        }
        catch (Exception ex)
        {


            MessageBox.Show(ex.Message);

        }
    }
4

3 に答える 3

4

MSDN を見ると、File.Create メソッドが FileStream を返すことがわかります。

では、ハングtry..catchを使用してファイルを作成していますFile.Createが、そのままにしておきます。FileStream

次のように変更します。

if (!File.Exists("D:\\MyNotes\\MyNotes.rtf")) {
    using (var stream = File.Create("D:\\MyNotes\\MyNotes.rtf")) {
        // nop
    }
}

.. または呼び出しClose()ます。

これは、「ほぼ常に」を説明しています..再度実行すると、ファイルが作成され、ブロックが実行されないためです。

ファイルをまったく作成しないことを検討することもできます。

于 2013-07-13T12:26:32.873 に答える
0

File.CreateメソッドStream (より具体的にはFileStreamであり、その型はIDisposableを実装します。 IDisposable を取得するたびに、適切に破棄することが重要です。 File.Create によって返されたオブジェクトを破棄しないため、例外を取得します。

多くの場合、ファイルの読み取り/書き込み時に、メソッドFile.ReadAllTextおよびFile.WriteAllTextを使用して目的を達成できます。これらのメソッドは、IDisposable オブジェクトを返さないため、この点で簡単に操作できます。

あなたの場合、IDisposable オブジェクトを返すメソッドを使用する理由はありません。File.ReadAllText と File.WriteAllText を使用するだけです。別の言い方をすると、ストリームは必要ありません。単にテキストを読み書きしたいだけです。

実際には、File.ReadAllText も必要ありません。

public class Form1
{
    private const string fileName = @"D:\MyNotes\MyNotes.rtf";

    public Form1()
    {
        InitializeComponent();

        if (!File.Exists(fileName))
            File.WriteAllText(fileName, "");

        richTextBox1.LoadFile(fileName);
    }

    private void Form1_FormClosing(object sender, FormClosingEventArgs e)
    {
        richTextBox1.SaveFile(fileName);
    }
}
于 2013-07-13T12:56:19.490 に答える
0
FileStream fs = System.IO.File.Create("D:\\MyNotes\\MyNotes.rtf");
fs.Close();

System.IO.File.Create() は、ファイルをずっと開いていました。

于 2013-07-13T12:29:30.567 に答える