文件无法使用,因为另一个进程正在使用它 - 无法找到开放流

时间:2013-03-09 01:25:30

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

我正在使用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;
    }

2 个答案:

答案 0 :(得分:2)

该代码看起来不错。

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

如果您在其他位置打开该文件但尚未处理该流,或者如果另一个应用程序打开该文件,您将收到此异常。

答案 1 :(得分:1)

这里可能会发生的是,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")) {
      ...
    }
   }
}

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