C# 等待创建文件的正确方法

C# 等待创建文件的正确方法,c#,io,file-writing,C#,Io,File Writing,我有以下代码: // get location where application data director is located var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); // create dir if it doesnt exist var folder = System.IO.Path.Combine(appData, "SomeDir"); if (Syst

我有以下代码:

// get location where application data director is located
var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

// create dir if it doesnt exist
var folder = System.IO.Path.Combine(appData, "SomeDir");
if (System.IO.Directory.Exists(folder) == false)
    System.IO.Directory.CreateDirectory(folder);

// create file if it doesnt exist
var file = System.IO.Path.Combine(folder, "test.txt");
if(System.IO.File.Exists(file)== false)
     System.IO.File.Create(file);

// write something to the file
System.IO.File.AppendAllText(file,"Foo");
此代码在最后一行崩溃(
在mscorlib.dll中发生“System.IO.IOException”类型的未处理异常。如果我在创建文件后放置一个
Thread.Sleep(400)
,代码工作得很好等待文件创建的正确方式是什么?

附言。 我正在使用.NETFramework 3.5

即使我等待它崩溃:/


如果要使用
文件,则无需创建文件。AppendAllText

关于错误的根本原因,以及通常写入文件的首选方式:

该文件已创建,并返回一个您未使用/关闭的流。最好的方法应该是使用此流写入文件

using (FileStream fs = File.Create(file))
{
     fs.Write("What ever you need to write..");
}

原因是,声明如下:

public static FileStream Create(
    string path
)
它返回一个
文件流
。该方法应该用于创建和打开文件进行写入。由于您从未处理返回的
FileStream
对象,因此您基本上是将赌注押在垃圾收集器上,以便在需要重写文件之前收集该对象

using (FileStream fs = File.Create(file))
{
     fs.Write("What ever you need to write..");
}
因此,要解决原始解决方案的问题,您应该处理该对象:

System.IO.File.Create(file).Dispose();
现在,这里的问题是
文件。如果文件不存在,AppendAllText
实际上将创建该文件,因此您甚至不需要该代码,以下是删除不必要代码的完整代码:

// get location where application data director is located
var appData = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);

// create dir if it doesnt exist
var folder = System.IO.Path.Combine(appData, "SomeDir");
System.IO.Directory.CreateDirectory(folder);

// write something to the file
var file = System.IO.Path.Combine(folder, "test.txt");
System.IO.File.AppendAllText(file,"Foo");

Directory.CreateDirectory如果文件夹已经存在,同样不会崩溃,因此您可以安全地调用它。

我认为您不需要将其创建为AppendAllText,如果它不存在,则应该创建文件。当您尝试追加文本时,文件被打开,这可能也是异常的原因。对于其他文件,您也可以使用“using”语句。System.IO.File.AppendAllText在文件不存在时创建一个文件,这样您就不必先创建它。我只能假设对File.Create的调用创建了一个已清理的FileStream对象,但速度不够快,无法在调用AppendAllText时阻止该文件。很抱歉这个愚蠢的问题。我想我累了,哈哈