如果被进程 B 锁定,如何使用进程 A 删除文件 temp.jpg

Posted

技术标签:

【中文标题】如果被进程 B 锁定,如何使用进程 A 删除文件 temp.jpg【英文标题】:How to delete file temp.jpg with process A if locked by process B 【发布时间】:2012-04-16 10:50:34 【问题描述】:

如果 File.Delete() 文件 temp.jpg 被进程 B 锁定,进程 A 如何。close 如何处理文件 temp.jpg

IOExce 选项: 该进程无法访问该文件,因为它正被另一个进程使用

protected void ButtonJcrop_Click(object sender, EventArgs e)


    MembershipUser user = Membership.GetUser();
    String tempPath = Server.MapPath("..") + @"\Users\" + user.ProviderUserKey.ToString() + @"\temp.gif";


    System.Drawing.Image img = System.Drawing.Image.FromFile(tempPath);
    Bitmap bmpCropped = new Bitmap(100, 100);
    Graphics g = Graphics.FromImage(bmpCropped);
    Rectangle rectDestination = new Rectangle(0, 0, bmpCropped.Width, bmpCropped.Height);
    Rectangle rectCropArea = new Rectangle(Int32.Parse(hfX.Value), Int32.Parse(hfY.Value), Int32.Parse(hfWidth.Value), Int32.Parse(hfHeight.Value));
    g.DrawImage(img, rectDestination, rectCropArea, GraphicsUnit.Pixel);

    String mapPath = @"\Users\" + user.ProviderUserKey.ToString() + @"\" + user.ProviderUserKey.ToString() + ".gif";
    bmpCropped.Save(Server.MapPath("..") + mapPath);
    // bmpCropped.Save(Server.MapPath("..") + @"\Images\thumbs\CroppedImages\" + Session["WorkingImage"]);
    imCropped.ImageUrl = Request.ApplicationPath + mapPath;
    **File.Delete(tempPath);**

    PlaceHolderImCropped.Visible = true;

【问题讨论】:

How can I unlock a file that is locked by a process in .NET的可能重复 【参考方案1】:

等待进程 B 释放资源。

专业提示: 进程 B 锁定文件是有原因的。在我能想到的任何情况下,偷它都是一个坏主意,这不是病态的。

如果您处于病态:

    走出病态。你只是在挖掘 自己在更深。 终止进程 B。

还有其他技术吗?是的。但是,它们根据定义是不安全的,所以不要那样做。

【讨论】:

【参考方案2】:

唯一的方法是锁定进程将控制权传递给下一个进程。然后您可以捕获异常,否则文件将被锁定,直到锁定过程终止或通过控制。

【讨论】:

【参考方案3】:

文件tempPath

读取
System.Drawing.Image img

因此,在删除该文件之前,只需使用 Dispose() 方法即可。

img.Dispose();

【讨论】:

【参考方案4】:
    Bitmap bmpCropped = new Bitmap(100, 100);
    Graphics g = Graphics.FromImage(bmpCropped);
    Rectangle rectDestination = new Rectangle(0, 0, bmpCropped.Width, bmpCropped.Height);
    Rectangle rectCropArea = new Rectangle(Int32.Parse(hfX.Value), Int32.Parse(hfY.Value), Int32.Parse(hfWidth.Value), Int32.Parse(hfHeight.Value));

using (System.Drawing.Image img = System.Drawing.Image.FromFile(tempPath)) g.DrawImage(img, rectDestination, rectCropArea, GraphicsUnit.Pixel);

【讨论】:

以上是关于如果被进程 B 锁定,如何使用进程 A 删除文件 temp.jpg的主要内容,如果未能解决你的问题,请参考以下文章

删除被进程访问而锁定的文件

Linux删除大文件,df查看空间没变

检查文件是不是被进程文件句柄锁定

数据库死锁

linux删除文件 空间没有被释放

Python:检查文件被锁定