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

时间:2012-04-02 18:56:40

标签: c# asp.net .net temporary-files file-locking

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

IOExceoption: 该进程无法访问该文件,因为它正由另一个进程使用

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;
}

4 个答案:

答案 0 :(得分:1)

等待进程B释放资源。

<强>人提示: 进程B出于某种原因锁定了文件。在我认为不是病态的任何情况下偷窃它都是一个坏主意。

如果你处于病态:

  1. 摆脱病态。你只是在挖掘 你自己更深入。
  2. 杀死进程B.
  3. 还有其他技巧吗?是。但是,根据定义,它们并不安全,所以不要这样做。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

文件tempPath

读取
System.Drawing.Image img

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

img.Dispose();

答案 3 :(得分:0)

    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);