【问题标题】:File cannot be used because another process is using it - can't find open stream文件无法使用,因为另一个进程正在使用它 - 找不到打开的流
【发布时间】:2013-03-09 09:55:28
【问题描述】:

我正在使用 StreamWriter 写入文件。我正在使用“使用”,因此它应该自动关闭,但是当我尝试保存(写入文件)时,它给了我“无法访问文件,因为另一个进程正在使用它”错误。我似乎无法弄清楚它在哪里或为什么给我这个错误。这是我的代码

[WebMethod]
    public static bool saveToCSV(string[] valueArray)
    {
        bool saveOK = false;

        try
        {
            string filepath = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);

            using (StreamWriter sw = new StreamWriter(filepath + "\\spreadsheet.csv", false))
            {

                foreach (var i in valueArray)
                {
                    if (i.ToString() == "\n")
                    {
                        sw.Write(sw.NewLine);
                    }
                    else
                    {
                        {
                            if (i.ToString() == "")
                            {
                                sw.Write(" ");
                                sw.Write(",");
                            }
                            else
                            {
                                sw.Write(i.ToString());
                                sw.Write(",");
                            }
                        }
                    }
                }
                sw.Flush();
            }//close using

            saveOK = true;
        }
        catch (Exception ex)
        {
            saveOK = false;
        }

        return saveOK;
    }

【问题讨论】:

  • 尝试运行Handle.exe,看看哪个进程阻塞了资源。
  • 代码看起来不错,除了你在这一行有一组额外的{ },但不应该伤害代码..只需要快速查看一下..{ if (i.ToString() == "") { sw.Write(" "); sw.Write(","); } else { sw.Write(i.ToString()); sw.Write(","); } }
  • 查看所有代码,看看您是否正在为此创建另一个 StreamWriter 或 StreamReader 实例。

标签: c# asp.net visual-studio-2012


【解决方案1】:

该代码看起来没问题。

您还在哪里处理文件?所有其他文件 IO 操作是否包含在 using 块中?还有哪些其他应用程序可能会触及该文件?

如果您在其他地方打开文件并且没有释放流,或者如果另一个应用程序打开了该文件,您将收到此异常。

【讨论】:

  • 嗯。既然您提到了它,我查看了我的“打开文件”方法,发现我在阅读后从未关闭过流。我现在觉得很傻。
【解决方案2】:

这里可能发生的是您的saveToCSV 方法同时被调用了两次。本质上是两个客户端同时调用 Web 服务。这可能导致第一次调用打开文件以进行写入,因此第二次调用被拒绝访问的情况。

为了防止这种情况,您应该使用锁来控制对文件的访问

private static object _key = new object();

[WebMethod]
public static bool saveToCSV(string[] valueArray)
{
   ...
   lock (_key) { 
    using (StreamWriter sw = new StreamWriter(filePath + "\\spreadsheet.csv")) {
      ...
    }
   }
}

现在,如果同时发生多个客户端调用,它们将只尝试一次访问一个文件

【讨论】:

  • 非常感谢您的意见。实际发生的是,在我的“openCSV”方法中,我从未关闭流:(。但这是一个非常有趣的阅读
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-04
  • 2018-03-27
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
相关资源
最近更新 更多