【发布时间】:2015-03-26 16:36:40
【问题描述】:
我正在使用 FileStream 将画布图像保存到服务器。它第一次运行良好,但如果用户在同一会话期间再次访问该页面(不关闭浏览器),则会引发错误“进程无法访问文件 'C:\inetpub\wwwroot\CarmelFinancialWeb\Contracts\MyUniqueImageFileName. png',因为它正被另一个进程使用。”我尝试在 FileStream 上使用 close 和 dispose,但这仍在发生
过程: - 用户进入 AssignContract 页面,登录画布,点击保存按钮。 - 图像保存到文件 - 用户再次点击保存按钮(即使在等待几分钟后) - 错误消息说文件被另一个进程使用。
[AuthorizeAdmin]
[HttpPost]
public ActionResult AssignContract(string ID, ModelContract tempCurrentContract, string imageData)
{
try
{
if (imageData != null)
{
string fileName = "MyUniqueImageFileName.png";
string fileNameWitPath = Path.Combine(Server.MapPath("~/Contracts"), fileName);
using (FileStream fs = new FileStream(fileNameWitPath, FileMode.Create))
{
using (BinaryWriter bw = new BinaryWriter(fs))
{
byte[] data = Convert.FromBase64String(imageData);
bw.Write(data);
bw.Close();
bw.Dispose();
}
fs.Close();
fs.Dispose();
}
}
}
catch (Exception ex)
{
throw ex;
}
...
更新
对此没有任何反馈。有人对如何防止文件被锁定或如何解锁文件有建议吗?谢谢。
【问题讨论】:
-
您没有在此处锁定文件。其他事情正在发生。如果我不得不猜测,我会说是病毒扫描程序。最好在创建该文件后查看该文件并查看锁定它的进程。
-
另外你不需要调用 fs.Dispose 使用块会为你做这件事。也许调用 fs.Flush 可能会有所帮助。 (我对 FileStreams 不太擅长!!)
-
感谢 cmets。有趣的是病毒扫描程序可以锁定它。我怎么知道是什么锁定了文件?我有另一个地方可以将签名放在 pdf 上。会不会导致锁定?如果是这样,我如何解锁它? System.Drawing.Image image = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath("~/Contracts/MyUniqueImageFileName.png"));
-
使用名为 Process Explorer (superuser.com/questions/399659/…) 的程序,我可以看到 iisexpress.exe 正在锁定文件。所以我的代码中的某些东西正在锁定它。无论是创建文件还是从文件中读取,我都不知道。我如何找出并解决它?
-
我认为这并不重要,但我认为您要关闭手柄两次。当您调用 new 时,来自 fs 的句柄将传递给 bw。您应该在 dispose() bw 之后设置 fs = null。然后包装 fs.close(); fs.dispose() in if (fs != null) 所以句柄在抛出异常时关闭。
标签: asp.net-mvc filestream dispose access-denied binarywriter