尝试使用最近创建的文件后程序崩溃。 C#

时间:2010-05-26 15:04:40

标签: c# file-io streamwriter

所以这是我的代码

if (!File.Exists(pathName))
{
    File.Create(pathName);
}
StreamWriter outputFile = new StreamWriter(pathName,true);

但是每当我第一次运行程序时,都会创建带文件的路径。然而,一旦我到达StreamWriter行,我的程序崩溃了,因为它说我的fie正在被另一个进程使用。 File.Create和StreamWriter语句之间是否存在我缺少的东西?

4 个答案:

答案 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构造函数而不是传递路径名?