【问题标题】:C# Can't Access File Because It Is Being Used By Another ProcessC# 无法访问文件,因为它正被另一个进程使用
【发布时间】:2016-01-05 15:42:57
【问题描述】:

这是我上传图片的 MVC 控制器。我正在尝试检查是否 文件存在,然后删除旧文件并保存新文件。我在System.IO.File.Delete() 收到错误消息,告诉我该文件已在使用中,但我不知道我在哪里打开它以及如何关闭它。

[HttpPost]   
public ActionResult UploadImage(int? id, HttpPostedFileBase file, EmployeeViewModel employee)
{
    Employee employeeData = db.Employees.Find(id);
    if (file != null && file.ContentLength > 0)
    {
        // Assemble File Path/Extension String
        string[] fileSplit = file.FileName.Split('.');
        string extension = fileSplit[1];
        var fileNameNew = "employeeImage-" + id + "." + extension;
        var path = Path.Combine(Server.MapPath("~/Content/employeeImages/"), fileNameNew);

        var fileExists = System.IO.File.Exists(path);

        if (fileExists)
        {
            System.IO.File.Delete(path);
            file.SaveAs(path);
        }
        else
        {
            file.SaveAs(path);
        }

    }
    return RedirectToAction("Edit", new { id = id });
}

【问题讨论】:

  • 您是否尝试过重启您的网络服务器?
  • 是的,我什至重新启动了我的机器
  • 这听起来可能很愚蠢,但我还是会问。您在哪里选择要上传的源图像?好久没做ASP.NET了,不记得是怎么做上传的了,但是以前总是要写一个httphandler来处理文件上传。另一个快速的想法,您不必删除现有文件,只需将其保存到新文件,添加时间戳,这样您就可以一直保留员工的旧照片(看看是否有效)
  • 我通过网页和文件输入元素添加它。我会考虑尝试跳过删除并使用时间戳,我试图使用简单的命名约定“employeeImage-ID.extension”来简化文件检索,但我可以添加时间戳并搜索最新的一个在检索时具有匹配 ID。
  • 是否有任何网络方法或其他代码可以检索图像(而不是 url),使其作为流打开?您还可以使用名为 handle by sysinternals 的命令行程序,它可以显示哪个进程打开了文件。您可以将其用于手动故障排除,以确定打开的文件是什么。 technet.microsoft.com/en-us/sysinternals/handle.aspx

标签: c# .net


【解决方案1】:

可能有一个(网络)方法(类似于 GET 请求)或其他代码检索图像(而不是 url),将其作为流打开。

【讨论】:

    【解决方案2】:

    最可能的答案是:

    • 该文件位于网络共享上,并且其他人正在真正使用它(它是虚拟目录吗?)。
    • IIS/您的 Web 服务器正在锁定文件(请参阅Does IIS 6/7 lock image files whilst they're being served?
    • 您上传的文件与您正在写入的文件相同(抱歉,如果这听起来很傲慢,但您需要涵盖所有选项!)

    【讨论】:

      【解决方案3】:

      由于我找不到我的 POST 请求的问题,我意识到它必须在将我带到该页面的 GET 请求中。原来我是在调用 Image.FromFile() 而不是在那个 GET 请求中关闭它。

      【讨论】:

        猜你喜欢
        • 2011-07-05
        • 2011-04-17
        • 1970-01-01
        • 1970-01-01
        • 2016-12-24
        • 2013-06-28
        • 2018-03-27
        • 1970-01-01
        相关资源
        最近更新 更多