我正在使用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;
}
答案 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")) {
...
}
}
}
现在,如果同时发生多个客户端调用,他们将只尝试一次访问一个文件