web-dev-qa-db-ja.com

プロセスは別のプロセスによって使用されているため、ファイルにアクセスできません(ファイルは作成されますが、何も含まれていません)

using System.IO;

class test
{
    public static void Main()
    {

        string path=@"c:\mytext.txt";

        if(File.Exists(path))
        {
            File.Delete(path);
        }


        FileStream fs=new FileStream(path,FileMode.OpenOrCreate);
        StreamWriter str=new StreamWriter(fs);
        str.BaseStream.Seek(0,SeekOrigin.End); 
        str.Write("mytext.txt.........................");
        str.WriteLine(DateTime.Now.ToLongTimeString()+" "+DateTime.Now.ToLongDateString());
        string addtext="this line is added"+Environment.NewLine;
        File.AppendAllText(path,addtext);  //Exception occurrs ??????????
        string readtext=File.ReadAllText(path);
        Console.WriteLine(readtext);
        str.Flush();
        str.Close();

        Console.ReadKey();
  //System.IO.IOException: The process cannot access the file 'c:\mytext.txt' because it is //being used by another process.
  // at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)

    }
}
9
sunil

これを試して

string path = @"c:\mytext.txt";

if (File.Exists(path))
{
    File.Delete(path);
}

{ // Consider File Operation 1
    FileStream fs = new FileStream(path, FileMode.OpenOrCreate);
    StreamWriter str = new StreamWriter(fs);
    str.BaseStream.Seek(0, SeekOrigin.End);
    str.Write("mytext.txt.........................");
    str.WriteLine(DateTime.Now.ToLongTimeString() + " " + 
                  DateTime.Now.ToLongDateString());
    string addtext = "this line is added" + Environment.NewLine;
    str.Flush();
    str.Close();
    fs.Close();
    // Close the Stream then Individually you can access the file.
}

File.AppendAllText(path, addtext);  // File Operation 2

string readtext = File.ReadAllText(path); // File Operation 3

Console.WriteLine(readtext);

すべてのファイル操作で、ファイルは開かれ、開かれる前に閉じる必要があります。操作1の賢明なように、さらなる操作のためにファイルストリームを閉じる必要があります。

15
Gokul E

ファイルストリームを閉じる前にファイルに書き込んでいます:

using(FileStream fs=new FileStream(path,FileMode.OpenOrCreate))
using (StreamWriter str=new StreamWriter(fs))
{
   str.BaseStream.Seek(0,SeekOrigin.End); 
   str.Write("mytext.txt.........................");
   str.WriteLine(DateTime.Now.ToLongTimeString()+" "+DateTime.Now.ToLongDateString());
   string addtext="this line is added"+Environment.NewLine;

   str.Flush();

}

File.AppendAllText(path,addtext);  //Exception occurrs ??????????
string readtext=File.ReadAllText(path);
Console.WriteLine(readtext);

上記のコードは、現在使用しているメソッドを使用して機能するはずです。 usingステートメントも調べて、usingブロックでストリームをラップする必要があります。

4
Paddy

_File.AppendAllText_はあなたが開いたストリームを知らないので、内部的にファイルを再び開こうとします。ストリームがファイルへのアクセスをブロックしているため、_File.AppendAllText_は失敗し、表示される例外をスローします。

コードの別の場所で既に行っているように、代わりに_str.Write_または_str.WriteLine_を使用することをお勧めします。

ファイルは作成されますが、str.Flush()およびstr.Close()が呼び出される前に例外がスローされるため、何も含まれていません。

2
Yogster