"进程无法访问文件X,因为它正在被另一个进程使用" - C#

3
当我在控制台应用程序中执行以下代码时,出现“由于其他进程正在使用文件X,因此无法处理该文件”的错误提示:
List<string> lines1 = new List<string>();
List<string> lines2 = new List<string>();

string path1 = ConfigurationManager.AppSettings.Get("path1");
string path2 = ConfigurationManager.AppSettings.Get("path2");

File.Create(path1);
File.Create(path2);

foreach (object myObject in myObjects)
{
   //do some fancy logic here!!!
}

File.WriteAllLines(path1, lines1.ToArray());  //exception is thrown here
File.WriteAllLines(path2, lines2.ToArray());

我该如何解决这个问题?

2
File.Create(..)方法不是返回一个FileStream吗?在写入时请使用它,而不是其他的方法,然后要正确地调用.Close()来关闭它。 - Rudi Visser
5个回答

6
可能的问题在于File.Create方法。它创建并返回一个包含文件句柄的FileStream对象。该对象保持对文件的写入打开状态,因此会阻止后续的File.WriteAllLines调用。
最简单的解决方案是删除File.Create调用。让WriteAllLines方法为您创建文件即可。

1
你有两个选项:File.Create不仅创建文件,而且打开它。因此,你需要保留对文件流的引用,并像这样关闭它:
         var file1 = File.Create(path1);
         var file2 = File.Create(path2);
         file1.Close();
         file2.Close();

或者你可以直接跳过这一步,因为File.WriteAllLines(...)会在文件不存在时创建一个新的文件。

你可能想要利用像File.Exist这样的东西来防止其他异常,但这不是本问题的一部分。


0
如果您删除File.Create行,应该就没问题了。除非您在foreach循环中对文件进行某些操作,否则根本不需要调用File.Create方法。如果文件不存在,File.WriteAllLines将创建一个文件。由于File.WriteAllLines方法还会关闭文件流,因此您无需担心管理File.Create返回的文件流。

0

File.Create(path1)会打开文件并保持文件处于打开状态,因此锁定文件。

File.WriteAllLines将创建文件,因此无需先创建文件。

如果需要先创建它(例如测试路径),可以执行以下操作

    FileStream fs = File.Create(path1);
    fs.Close();

0
根据我的上面的评论,File.Create(..)返回一个FileStream对象,直到该方法关闭(也就是句柄仍然打开,因此文件仍然被锁定)它才会被销毁。当您尝试使用WriteAllLines时,它会尝试打开一个新的句柄,并因为一个已经打开而失败。
您可以使用以下代码,这个代码很好用(我刚测试过):
List<string> lines1 = new List<string>();
string path1 = @"C:\Development\test1.txt";
for (int i = 0; i < 20; i++)
    lines1.Add("Test " + i);

TextWriter textWriter = new StreamWriter(File.Create(path1));
foreach(string line in lines1)
    textWriter.WriteLine(line);
textWriter.Close();

上面的代码将利用创建文件时创建的相同流,因此您没有发生冲突的机会。
或者,如其他答案中所述,File.WriteAllLines方法将为您创建文件!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接