IOException文件由另一个进程使用

时间:2011-05-29 22:07:14

标签: c# image process ioexception

我已经创建了一个循环和删除给定目录中两个相似图像的函数。 (甚至多个目录):

public void DeleteDoubles()
    {
        SHA512CryptoServiceProvider sha1 = new SHA512CryptoServiceProvider();
        string[] images = Directory.GetFiles(@"C:\" + "Gifs");
        string[] sha1codes = new string[images.Length];
        GifImages[] Gifs = new GifImages[images.Length];

        for (int i = 0; i < images.Length; i++)
        {
            sha1.ComputeHash(GifImages.ImageToByteArray(Image.FromFile(images[i])));
            sha1codes[i] = Convert.ToBase64String(sha1.Hash);
            Gifs[i] = new GifImages(images[i], sha1codes[i]);
        }

        ArrayList distinctsha1codes = new ArrayList();
        foreach (string sha1code in sha1codes)
            if (!distinctsha1codes.Contains(sha1code))
                distinctsha1codes.Add(sha1code);

        for (int i = 0; i < distinctsha1codes.Count; i++)
            if (distinctsha1codes.Contains(Gifs[i].Sha1Code))
            {
                for (int j = 0; j < distinctsha1codes.Count; j++)
                    if (distinctsha1codes[j] != null && distinctsha1codes[j].ToString() == Gifs[i].Sha1Code)
                    {
                        distinctsha1codes[j] = Gifs[i] = null;
                        break;
                    }
            }

        try
        {
            for (int i = 0; i < Gifs.Length; i++)
                if (Gifs[i] != null)
                    File.Delete(Gifs[i].Location);
        }
        catch (IOException)
        {
        }
    }

问题是,在我离开了我要删除的文件列表后,我无法删除它们,因为我得到“另一个进程正在使用System.IO.IOException文件......”

我尝试使用procexp查看哪些进程正在使用我的文件,而MyApplication.vshost.exe似乎正在使用这些文件。它开始使用该行上的文件:

  

sha1.ComputeHash(GifImages.ImageToByteArray(Image.FromFile(图像[1])));

含义Image.FromFile(images [i])打开文件但从不关闭它。

1 个答案:

答案 0 :(得分:3)

documentation告诉你:

  

文件保持锁定状态,直到图像被丢弃。

因此,您需要在尝试删除图像之前处置该图像。只需在最短的时间内保持它,如下:

for (int i = 0; i < images.Length; i++)
{
    using( var img = Image.FromFile( images[i] ) )
    {
        sha1.ComputeHash(imageToByteArray(img));
    }

    sha1codes[i] = Convert.ToBase64String(sha1.Hash);
    Gifs[i] = new GifImages(images[i], sha1codes[i]);
}