创建文件和复制数据引发错误

时间:2013-08-30 04:13:34

标签: c# file-io locking

我在Microsoft Visual Studio 2012中使用C#,我正在处理以下代码:

 string source =  "d:\\source.txt";
 string newFile = "d:\\newFile.txt"; 
 if(!File.Exists(newFile))
 {
      File.Create(newFile);
      string content = File.ReadAllText(source);
      File.AppendAllText(newFile,content);
 }

此代码成功创建了文件,但在编译File.AppendAllText(newFile,content)时,它会生成错误:

  

该进程无法访问文件“d:\ newFile.txt”,因为它正由另一个进程使用。

为什么会这样?

2 个答案:

答案 0 :(得分:6)

File.Create方法返回FileStream个对象。这使文件保持打开状态以进行写入。在该对象关闭之前,无法写入该文件。解决此问题的最佳方法是简单地关闭返回的文件

File.Create(newFile).Close();

此代码实质上是将现有文件的内容复制到新文件中。已经有一个可用的API可以做到这一点:File.Copy。您的代码可以简化为以下

try { 
  File.Copy(source, newFile);
} catch (Exception) { 
  // File already exists or write can't occur 
}

答案 1 :(得分:0)

您不需要创建文件,AppendAllText创建(如果不存在),您将获得异常,因为File.Create返回打开的文件流,然后您尝试再次访问同一文件。在访问同一文件之前,您需要正确关闭该流。

 string source =  "d:\\source.txt";
 string newFile = "d:\\newFile.txt"; 
 if(!File.Exists(newFile))
 {
      File.AppendAllText(newFile,File.ReadAllText(source););
 }

<强> File.AppendAllText:

  

打开文件,将指定的字符串附加到文件中,然后   关闭文件。 如果文件不存在,则此方法创建一个   文件,将指定的字符串写入文件,然后关闭文件。

但您可以通过一行完成任务

File.Copy(source , newFile , false);