0

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

2 回答 2

2

该代码看起来不错。

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

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

于 2013-03-09T01:32:53.363 回答
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")) {
      ...
    }
   }
}

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

于 2013-03-09T01:55:28.003 回答