文件正在被另一个进程使用 .NET

3

我需要创建/附加一个文本文件并在其中写入一些数据。当我将下面的代码写入我的ASP.NET应用程序时,它会给出错误提示:文件正在被另一个进程使用。

if (!File.Exists(path\file))
    File.CreateText(path\file);
using(StreamWriter sw = File.AppendText(Server.MapPath(path\file)))
{
    sw.WriteLine("Text Data");
    sw.Close();
}

1
如果您正在另一个进程中使用该文件,请尝试在打开它之前释放它。并且在打开文件(作为读取或写入)之前声明意向锁可能有所帮助。 - Erre Efe
3
我相信 sw.Close() 不是必要的,因为你已经将 StreamWriter 放在 using 块中。 - Tim
1
首先要做的就是找出是哪个进程占用了锁(或者是哪些进程)。 - Richard
3个回答

5
如果另一个进程独占了你想要的文件,除了强制删除所有与该文件相关的句柄或杀死该进程之外,你几乎无能为力,这两种方法都会导致未定义的行为(由拥有独占锁的其他程序引起)。
你应该:
1.等待其他程序完成对文件的使用;
2.写入另一个文件;
3.其他合理的操作。
如果你确定只有你的代码访问该文件,请返回并确保在完成对其的操作后关闭所有与该文件相关的句柄。
如果你还没有这样做(我们无法看到你的所有代码),你需要关闭从File.CreateText()调用返回的打开文件句柄,因为它返回一个带有打开文件句柄的StreamWriter

5
您需要按照下面的代码创建一个文件,并在创建后关闭该文件。请保留HTML标记。
if (!File.Exists(""))
{            
    StreamWriter sr =  File.CreateText("");
    sr.Close();
}

看一下来自MSDN的这个例子。

这将向您展示如何创建文本文件。

或者,您可以按照以下方式创建文本文件;下面的代码来自MSDN:

if (!File.Exists(path)) 
{
    // Create a file to write to.
    using (StreamWriter sw = File.CreateText(path)) 
    {

    }   
}

1
在他发布的代码中,StreamWriter 在 using 块中,并且被显式关闭。 - Tim
你能看到他的前两行代码吗?他试图创建一个文件,如果它不存在的话。顺便说一下,这段代码已经测试过了。 - Muhammad Akhtar
@Tim;看一下MSDN上的这个例子:http://msdn.microsoft.com/zh-cn/library/3saad2h5(v=VS.80).aspx - Muhammad Akhtar
1
啊,明白了。我看到了,但没有注意到细微差别。如果文件不存在,他的代码将在进入using块时使用它(由于File.CreateText)。对于造成的困惑,非常抱歉。你可能需要编辑你的答案,让它更清晰地表达你的意思。干得好。 - Tim

0

你是否在文本编辑器中打开了该文件?最近是否已在文本编辑器中打开过它?如果是,您应确保完全关闭文本编辑器并终止其进程。

如果没有,则很可能意味着某些其他脚本或同一脚本的先前版本陷入了无限循环并打开了该文件。如果您可以承受杀死所有ASP.NET脚本,那么这可能会修复它。


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