C# 进程无法访问该文件,因为另一个进程正在使用该文件-使用静态类

C# 进程无法访问该文件,因为另一个进程正在使用该文件-使用静态类,c#,asp.net,C#,Asp.net,当我试图删除刚上传的文件时(这至少是上传文件后的几秒钟,因此我确信文件已完成写入),我收到错误“进程无法访问文件,因为它正被另一个进程使用”。你知道为什么会这样吗?PS:我生成的缩略图删除没有问题,但原件不知怎么被锁定了 var FileExt = Path.GetExtension(photo.File.FileName); var FilePath = Path.Combine(Server.MapPath("~/App_Data/" + ph

当我试图删除刚上传的文件时(这至少是上传文件后的几秒钟,因此我确信文件已完成写入),我收到错误“进程无法访问文件,因为它正被另一个进程使用”。你知道为什么会这样吗?PS:我生成的缩略图删除没有问题,但原件不知怎么被锁定了

            var FileExt = Path.GetExtension(photo.File.FileName);
            var FilePath = Path.Combine(Server.MapPath("~/App_Data/" + photo.ClientId), photo.PhotoId.ToString()) + FileExt;
            photo.File.SaveAs(FilePath);
            var ThumbFilePath = Path.Combine(Server.MapPath("~/App_Data/" + photo.ClientId),photo.PhotoId.ToString() + "_thumbnail") + FileExt;
            PhotoTools.MakeThumbnail(FilePath, ThumbFilePath, 0.15);
            return RedirectToAction("Create");
在PhotoTools类中

    public static void MakeThumbnail(string ImgIn, string ImgOut, double Percent)
    {
        Image img = Image.FromFile(ImgIn);
        double Width = img.Width*Percent;
        double Height = img.Height*Percent;
        MakeThumbnail(ImgIn, ImgOut, (int)Width, (int)Height);
    }
删除函数

    public ActionResult DeleteConfirmed(int id)
    {
        Client client = db.Clients.Find(id);
        db.Clients.Remove(client);
        db.SaveChanges();
        if (Directory.Exists(Server.MapPath("~/App_Data/" + id)))
        {
            Directory.Delete(Server.MapPath("~/App_Data/") + id,true);
        }
        return RedirectToAction("Index");
    }

在make缩略图方法中,确保正在调用
图像
类型上的
Dispose()
。或使用以下使用语法:

using (Image img = Image.FromFile(ImgIn))
{
    // Your code
}

在make缩略图方法中,确保正在调用
图像
类型上的
Dispose()
。或使用以下使用语法:

using (Image img = Image.FromFile(ImgIn))
{
    // Your code
}

显示其他生成缩略图的代码。很确定你没有处理一个类。你说“当我试图删除我刚刚上传的文件时”,这需要一点澄清。因为文件或缩略图的代码中没有
delete
,所以听起来您可能在谈论使用Windows资源管理器或类似工具删除这些文件?这是正确的还是…?您是在创建文件的同一请求期间删除这些文件的?我更新了代码以显示删除方法,以供将来参考。该方法是单独调用的。请显示其他生成缩略图的代码。很确定你没有处理一个类。你说“当我试图删除我刚刚上传的文件时”,这需要一点澄清。因为文件或缩略图的代码中没有
delete
,所以听起来您可能在谈论使用Windows资源管理器或类似工具删除这些文件?这是正确的还是…?您是在创建文件的同一请求期间删除这些文件的?我更新了代码以显示删除方法,以供将来参考。该方法是单独调用的。+1如果您能向OP解释GC在加载非托管资源时如何对文件进行“根引用”,这会导致文件被锁定,那就太好了。@JeremyThompson-我不确定我对这方面的了解是否足以解释它。你能用它编辑我的帖子吗?或者在这里编辑帖子,这样我就可以上传投票了吗?+1如果你能向OP解释GC是如何通过加载非托管资源来对文件进行“根引用”的,这会导致文件被锁定。@JeremyThompson-我不确定我对这方面的了解是否足以解释它。你能用它编辑我的帖子吗?或者在这里发布,这样我就可以投票了?