我有以下代码:
// 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");
此代码在最后一行(An unhandled exception of type 'System.IO.IOException' occurred in mscorlib.dll
)崩溃。如果我在创建文件后放置Thread.Sleep(400)
,则代码效果很好。 在创建文件之前等待的正确方法是什么?
P.S。 我正在使用.net framework 3.5
即使我等它崩溃:/
答案 0 :(得分:4)
如果您打算使用File.AppendAllText
关于错误的根本原因,以及一般写入文件的首选方法:
文件已创建,并返回了您未使用/关闭的流。最好的方法应该是使用此流来写入文件。
using (FileStream fs = File.Create(file))
{
fs.Write("What ever you need to write..");
}
答案 1 :(得分:3)
原因是因为File.Create被声明为:
public static FileStream Create(
string path
)
返回FileStream
。该方法应该用于创建和打开文件以进行写入。由于您从未丢弃返回的FileStream
对象,因此您基本上将您的赌注押在垃圾收集器上以在需要重写文件之前收集该对象。
因此,要解决天真解决方案的问题,您应该处理该对象:
System.IO.File.Create(file).Dispose();
现在,问题是File.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
如果文件夹已经存在,同样不会崩溃,所以你可以安全地调用它。