3

これは、ファイルを作成して書き込むために行ったことです。

    Create_Directory = @"" + path;
    Create_Name = file_name;

    private void Create_File(string Create_Directory, string Create_Name )
    {
        string pathString = Create_Directory;
        if (!System.IO.Directory.Exists(pathString)) { System.IO.Directory.CreateDirectory(pathString); }

        string fileName = Create_Name + ".txt";
        pathString = System.IO.Path.Combine(pathString, fileName);
        if (!System.IO.File.Exists(pathString)) { System.IO.File.Create(pathString); }

        ///ERROR BE HERE:
        System.IO.StreamWriter file = new System.IO.StreamWriter(pathString);
        file.WriteLine(Some_Method(MP.Mwidth, MP.Mheight, MP.Mtype, "" )); 
        file.Close();
    }

ここで私が一日中戦ってきた問題は、作成後にファイルを書き込むことです。したがって、私のプログラムは問題なくファイルを作成し、書き込む前にエラーを出します:

「タイプ 'System.IO.IOException' の未処理の例外が mscorlib.dll で発生しました」

「追加情報: 別のプロセスで使用されているため、プロセスはファイル 'D:\Projects\Project 15\Project 15\world\world maps\A.txt' にアクセスできません。」

面白いことに、プログラムを再度実行して既存のファイルを作成しようとすると、ご覧のとおり、ファイルの作成がスキップされ、書き込みに進み、正常に動作します。プログラムにファイルを作成させずに書き込みさせたいと思います再実行する必要があります...ここで何が表示されないのですか?? :S

4

3 に答える 3

5

問題は、File.Createが open を返し、Streamそれを決して閉じないことです。ファイルは、作成した時点で(あなたによって)「使用中」ですStreamWriter

そうは言っても、ファイルを「作成」する必要はありません。 StreamWriter自動的にそれを行います。この行を削除するだけです:

   if (!System.IO.File.Exists(pathString)) { System.IO.File.Create(pathString); }

そして、すべてが書かれたとおりに機能するはずです。

ただし、より安全にするために、これを少し書き直すことに注意してください。

private void Create_File(string directory, string filenameWithoutExtension )
{
    // You can just call it - it won't matter if it exists
    System.IO.Directory.CreateDirectory(directory);

    string fileName = filenameWithoutExtension + ".txt";
    string pathString = System.IO.Path.Combine(directory, fileName);

    using(System.IO.StreamWriter file = new System.IO.StreamWriter(pathString))
    {
        file.WriteLine(Some_Method(MP.Mwidth, MP.Mheight, MP.Mtype, "" )); 
    }
}

File.WriteAllTextまたは同様の方法を使用して、この方法でファイルを作成しないようにすることもできます。ブロックを使用すると、例外が発生したusing場合でも、ファイルが閉じられることが保証されます。Some_Method

于 2013-03-19T00:24:56.090 に答える
2

File多くの作業をまとめてくれるクラスを使用できます

例:

private void Create_File(string Create_Directory, string Create_Name)
{
    string pathString = Create_Directory;
    if (!System.IO.Directory.Exists(pathString)) { System.IO.Directory.CreateDirectory(pathString); }

    pathString = System.IO.Path.Combine(pathString, Create_Name + ".txt");
    File.WriteAllText(fileName, Some_Method(MP.Mwidth, MP.Mheight, MP.Mtype, ""));
}
于 2013-03-19T00:27:29.820 に答える
0
 static void Main(string[] args)
        {
            FileStream fs = new FileStream("D:\\niit\\deep.docx", FileMode.Open, FileAccess.Read);
            StreamReader sr = new StreamReader(fs);
            sr.BaseStream.Seek(0, SeekOrigin.Begin);
            string str = sr.ReadLine();
            Console.WriteLine(str);
            Console.ReadLine();

        }
于 2014-07-22T20:17:21.643 に答える