【问题标题】:How do I close the filestream after creating a file or otherwise create access to the newly created file?创建文件后如何关闭文件流或创建对新创建文件的访问权限?
【发布时间】: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


【解决方案1】:

问题似乎是每次我访问图像以将其输出到另一个进程时文件都被锁定。因此,对于我访问它的每个实例:

System.Drawing.Image image = System.Drawing.Image.FromFile(HttpContext.Current.Server.MapPath("~/Contracts/MyUniqueImageFileName.png"));

我不得不处理掉图片:

image.Dispose();

我确实注意到,如果我等了几分钟并尝试保存新图像,它并没有被锁定。那么也许 Dispose 功能会在一段时间后自动发生?如果有人知道这一点或有办法在编写新文件之前解锁所有文件,我会对它是如何完成的感兴趣。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2021-01-17
    • 2015-03-16
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多