我在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”,因为它正由另一个进程使用。
为什么会这样?
答案 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);