1

\ AppData \ Roamingに、アプリが書き込んでいるファイルがいくつかあります。アプリケーションが次のように起動したときにファイルを作成します。

private void Form1_Load(object sender, EventArgs e)
{
DirectoryInfo _File = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt"));
}

後で、ボタンをクリックしてファイルに書き込むと、ファイルがすでに使用されており、アクセスできないというエラーが表示されます。これをどのように修正しますか?

上記のコードを削除して自分でファイルを作成すると、アプリケーションが問題なくファイルに書き込むため、ファイルに書き込むコードは正しいです。したがって、ファイルへの書き込みに使用するコードに問題があるとは思いません。しかし、ここでは参照用です:

var myfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt"));
StreamWriter sw = new StreamWriter(myfile);
sw.WriteLine(textBox1.text);
sw.Close();

助けてくれてありがとう!

4

4 に答える 4

3

ここにはいくつかの概念があり、根本的な問題に明確に対処するための十分な情報があるかどうかはわかりませんが、いくつかの指針を示します。

FileModeFileAccess、およびFileShareの列挙に注意する必要があります。

最初のFileModeは、ファイルの存在に関して何をするつもりかを指定します。上記のリンクに記載されているさまざまなオプションがあります。mここで問題があるとは思いませんが、言及する必要があります。

2番目のFileAccessは、ファイルとの意図された相互作用(読み取り、書き込み、またはその両方)に関するものです。読み取りへのアクセスを要求する場合、ファイルを開いているか、すでに開いている他のユーザー(Webブラウザーコントロールを含む)は、他のリーダーとの共有を許可している必要があります。

最後のFileShareは、ファイルへのアクセスを誰と共有するかを定義します。他の人がそれを読み取ることができるか、他の人がそれに書き込むことができるか、両方を指定できるか、またはどちらも指定できません。

使用しているコードは、最も単純なデフォルトを使用してファイルにアクセスしています。これは、WebBrowserのアクセスモードと互換性がない可能性があります。代わりに私が提案するものは次のとおりです。

var myfile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApp\myfile.txt"));
using (var fs = new FileStream(myfile, FileMode.OpenOrCreate, FileAccess.Write, FileShare.ReadWrite)) {
    using (var sw = new StreamWriter(fs)) {

        // You probably want to move to the end of the file before writing...
        fs.Seek(0, SeekOrigin.End);

        sw.WriteLine(textBox1.text);
        sw.Close();
    }
}

これは、あなたの意図と、読み取りまたは書き込みを行う可能性のある他のユーザーと共有する意思があるという事実を非常に明確に表しています(Webブラウザーはファイルに書き込みを行わないことはわかっていますが、何らかの理由で書き込みで開こうとしている可能性があります)とにかく意図)。

于 2012-07-05T14:59:06.563 に答える
1

ファイル操作の場合(および管理されていないリソースにアクセスしているときはいつでも)、最善の策は、必要な操作を実行するのに十分な時間だけファイルのハンドルを取得してから解放することです。

あなたの場合、あなたはリソースを開いていて、後でそれを再び開こうとしています。これを変える。実際に何かをするまで、ファイルを作成しないでください。また、USING条項を調べてください。読み取りまたは書き込みが完了したらすぐにリリースします。

于 2012-07-05T14:35:15.720 に答える
0

次のようにFileInfoオブジェクトにアクセスして、ファイルを作成/追加/書き込みしてみてください。ファイルはすでにFileInfoクラスによって取得されています。

次のように使用します。

 FileInfo fi1 = new FileInfo(path);

        //Create a file to write to.
        using (StreamWriter sw = fi1.CreateText()) 
        {
            sw.WriteLine("Hello");
            sw.WriteLine("And");
            sw.WriteLine("Welcome");
        }   

        //Open the file to read from.
        using (StreamReader sr = fi1.OpenText()) 
        {
            string s = "";
            while ((s = sr.ReadLine()) != null) 
            {
                Console.WriteLine(s);


            }
         } 
于 2012-07-05T14:33:17.797 に答える
-1

を使用してみてくださいusing

using (StreamWriter sw = new StreamWriter(myfile))
{
    sw.Write(textBox1.text);
}
于 2012-07-05T14:32:46.993 に答える