【问题标题】:File is being used by another process .NET文件正在被另一个进程 .NET 使用
【发布时间】:2011-07-24 06:10:51
【问题描述】:

我需要创建/附加一个文本文件并在其中写入一些数据。当我将以下代码写入我的 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();
}

【问题讨论】:

  • 如果您在另一个进程中使用该文件,请尝试在此之前释放它。并在打开文件之前声明意图锁(如读或写)。这可能会有所帮助。
  • 我相信 sw.Close() 是不需要的,因为您在 using 块中有 StreamWriter。
  • 首先要做的是找出持有锁的进程(或者可能是哪些进程)。

标签: c# .net asp.net file-io


【解决方案1】:

您必须在下面的代码中创建一个类似的文件,并在创建后关闭该文件..

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)) 
    {

    }   
}

【讨论】:

  • 在他发布的代码中,StreamWriter 既在 using 块中,又显式关闭。
  • 你能看到他的前两行代码,当文件不存在时,他试图创建文件。这段代码顺便测试一下。
  • @Tim;看看这个来自 MSDN msdn.microsoft.com/en-us/library/3saad2h5(v=VS.80).aspx 的例子
  • 啊——明白了。看到了,但没有注意到细微差别。如果文件不存在,他的代码将在进入 using 块时使用它(由于 File.CreateText)。对困惑感到抱歉。您可能想要编辑您的答案,以便更清楚地了解您所说的内容。很好的收获。
【解决方案2】:

如果另一个进程对您想要的文件具有排他锁,您几乎无能为力,除了强制删除文件的所有句柄或终止进程,这两者都会导致未定义的行为(由具有排他锁的其他程序)。

你应该

  1. 等待其他程序完成使用文件
  2. 写入另一个文件
  3. 其他有意义的东西。

如果您确定只有您的代码可以访问此文件,只需返回并确保在完成后关闭您之前打开的文件的所有句柄。

如果您还没有这样做(我们没有看到您的所有代码),您需要从您的 File.CreateText() 调用中关闭打开的文件句柄,因为它返回一个带有打开句柄的 StreamWriter你的文件。

【讨论】:

    【解决方案3】:

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

    如果不是,则可能意味着某个其他脚本,或者同一脚本的某个先前版本卡在无限循环中已打开文件。如果你有能力杀死所有的 ASP.NET 脚本,它可能会修复它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-13
      • 2016-12-24
      • 1970-01-01
      • 2011-09-01
      • 1970-01-01
      相关资源
      最近更新 更多