C# 文件无法使用,因为另一个进程正在使用它-can';我找不到小溪
我正在使用StreamWriter写入文件。我使用的是“using”,所以它应该会自动关闭,但是当我尝试保存(写入文件)时,它会出现“无法访问文件,因为另一个进程正在使用”错误。我似乎不知道它在哪里或为什么给我这个错误。这是我的密码C# 文件无法使用,因为另一个进程正在使用它-can';我找不到小溪,c#,asp.net,visual-studio-2012,C#,Asp.net,Visual Studio 2012,我正在使用StreamWriter写入文件。我使用的是“using”,所以它应该会自动关闭,但是当我尝试保存(写入文件)时,它会出现“无法访问文件,因为另一个进程正在使用”错误。我似乎不知道它在哪里或为什么给我这个错误。这是我的密码 [WebMethod] public static bool saveToCSV(string[] valueArray) { bool saveOK = false; try {
[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;
}
代码看起来不错
你还在哪里处理这个文件?是否所有其他文件IO操作都包含在使用块的中?哪些其他应用程序可能正在接触该文件
如果您在别处打开该文件,但尚未处理该流,或者如果另一个应用程序打开了该文件,则会出现此异常。该代码看起来正常
你还在哪里处理这个文件?是否所有其他文件IO操作都包含在使用
块的中?哪些其他应用程序可能正在接触该文件
如果您在其他位置打开该文件,但尚未处理该流,或者如果其他应用程序打开了该文件,则会出现此异常。这里可能发生的情况是,您的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")) {
...
}
}
}
现在,如果同时发生多个客户端调用,它们将一次只尝试访问一个文件这里可能发生的情况是,您的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")) {
...
}
}
}
现在,如果同时发生多个客户端调用,它们将一次只尝试访问一个文件尝试运行以查看哪个进程正在阻塞资源。代码看起来很好,只是这行中有一组额外的{}
,但不应损坏代码。。只需快速地再看一眼。{if(i.ToString()==”){sw.Write(“”);sw.Write(“”;}else{sw.Write(i.ToString());sw.Write(“,”;}
查看所有代码,查看是否正在为该事实创建StreamWriter或StreamReader的另一个实例。尝试运行以查看哪个进程正在阻止资源。代码看起来很好,但您还有一组{}
在这一行中,但不应该损害代码..只需要快速地再看一眼..{if(i.ToString()==“”){sw.Write(“”);sw.Write(“”,“”;}else{sw.Write(i.ToString());sw.Write(“,”;}
查看您的所有代码,看看您是否正在为该事实创建另一个StreamWriter或StreamReader实例..Mm.现在您提到了它,我查看了我的“打开文件”方法,我发现我在阅读后从未关闭过流。我现在觉得很傻。Mm.现在您提到了它,我查看了我的“打开文件”方法,我看到我在阅读后从未关闭过流。我现在觉得很傻。非常感谢你的输入。实际发生的是,在我的“openCSV”方法中,我从未关闭流:(。但这是一本非常有趣的书。非常感谢你的输入。实际发生的是在我的“openCSV”中方法我从未关闭过流:(。但这是一本非常有趣的书