3

所以这是我的代码

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

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

4

4 回答 4

6

File.Create不只是创建文件——它还打开它以供读写。因此,当您尝试通过您自己的进程创建 StreamWriter 时,该文件确实已经在使用中。

pathName如果文件不存在,StreamWriter将创建指定的文件,因此您可以简单地删除File.Exists检查并简化您的代码:

using (var writer = new StreamWriter(pathName, true))
{
   // ...
}

来自MSDN

StreamWriter 构造函数(流)

为指定文件初始化 StreamWriter 类的新实例 [...]。如果文件存在,它可以被覆盖或附加到。如果文件不存在,则此构造函数创建一个新文件。

于 2010-05-26T15:08:19.957 回答
2

正如其他人所提到的,File.Create正在创建一个FileWriter保持文件打开的文件。但除此之外,没有理由在尝试打开文件之前检查文件是否存在。只要告诉File.Open打开一个现有文件,如果有的话:

var outputFile = new StreamWriter(File.Open(pathName, FileMode.OpenOrCreate));
于 2010-05-26T15:12:05.000 回答
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 构造函数(append=true)将创建或附加文件

于 2010-05-26T15:07:09.503 回答
0

File.Create 返回一个 FileStream。为什么不保存它并将其传递给 StreamWriter 构造函数而不是传递路径名?

于 2010-05-26T15:09:52.007 回答