所以这是我的代码
if (!File.Exists(pathName))
{
File.Create(pathName);
}
StreamWriter outputFile = new StreamWriter(pathName,true);
但是每当我第一次运行程序时,都会创建带文件的路径。然而,一旦我到达StreamWriter行,我的程序崩溃了,因为它说我的fie正在被另一个进程使用。 File.Create和StreamWriter语句之间是否存在我缺少的东西?
答案 0 :(得分:6)
File.Create不只是创建文件 - 它还会打开它进行读写。因此,当您尝试创建StreamWriter时,该文件确实已经被使用:通过您自己的进程。
StreamWriter会创建pathName
指定的文件(如果该文件不存在),因此您只需删除File.Exists
支票并简化您的代码:
using (var writer = new StreamWriter(pathName, true))
{
// ...
}
来自MSDN:
StreamWriter构造函数(流)
为指定的文件[...]初始化StreamWriter类的新实例。如果文件存在,则可以覆盖或附加。如果该文件不存在,则此构造函数将创建一个新文件。
答案 1 :(得分:2)
正如其他人所提到的那样,File.Create
正在创建一个FileWriter
来保持文件处于打开状态。但除此之外,在尝试打开文件之前没有理由检查文件是否存在。只需告诉File.Open
打开现有文件,如果有的话:
var outputFile = new StreamWriter(File.Open(pathName, FileMode.OpenOrCreate));
答案 2 :(得分:1)
在File.Create之后,流仍处于打开状态。
您可以使用:
File.Create(pathName).Close();
这会创建文件并直接关闭它。
更多人接受的是:
using (var file = File.Create(pathName)) {
// use the file here
// it will be closed when leaving the using block
}
另外:为什么要创建一个文件,在代码中进一步创建2行?如果文件不存在,StreamWriter constructor(使用append = true)将创建或附加该文件。
答案 3 :(得分:0)
File.Create返回一个FileStream。为什么不保存它并将其传递给StreamWriter构造函数而不是传递路径名?