Файл IOException используется другим процессом - PullRequest
1 голос
/ 30 мая 2011

Я сделал функцию, которая циклически удаляет два похожих изображения в заданном каталоге.(или даже несколько каталогов):

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файл используется другим процессом ... "

Я попытался с помощью procxp посмотреть, какие процессы используют мои файлы, и, похоже, файлы используются MyApplication.vshost.exe.Он начинает использовать файл в этой строке:

sha1.ComputeHash (GifImages.ImageToByteArray (Image.FromFile (images [i]))));

Значение Image.FromFile (images [i]) открывает файл, но никогда не закрывает его.

1 Ответ

3 голосов
/ 30 мая 2011

Документация сообщает вам столько же:

Файл остается заблокированным, пока изображение не будет удалено.

Итак, вам нужно утилизироватьизображения, прежде чем пытаться удалить его.Просто держите его как можно меньше, например:

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]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...