Использование Image.FromFile не освобождает дескриптор файла

Я собираюсь объединить несколько файлов TIF с несколькими изображениями в один файл tiff с несколькими изображениями и иметь проблемы с удалением файлов tiff источника, поскольку класс Image продолжает удерживать дескриптор на них.

Я читаю изображение tiff через Image.FromFile:

Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile);

После этого я прочитал все другие tiff-изображения таким же образом и добавлю их к полученному tiff-изображению.

Когда я заканчиваю, я использую этот код для выпуска ссылок и сохранения результирующего файла:

ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush);
resultTiff.SaveAdd(ep);
resultTiff.Dispose();

Теперь проблема в том, что дескриптор файлов по-прежнему существует (и, следовательно, файлы не могут быть удалены), если я не вызову GC.Collect() после вызова resultTiff.Dispose().

Вы можете себе представить, что я не чувствую себя очень комфортно, позвонив в GC, так есть ли другой способ достичь этого?

Ответ 1

Лучший способ решить проблему с помощью Image.FromFile, в которой он оставляет открытые дескрипторы файлов, заключается в использовании Image.FromStream.

using (FileStream fs = new FileStream(filePath, FileMode.Open, FileAccess.Read))
{
   using (Image original = Image.FromStream(fs))
   {
      ...

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

Ответ 2

Или попробуйте:

Using(Bitmap resultTiff = (Bitmap) Image.FromFile(strImageFile))
{
   ep.Param[0] = new EncoderParameter(enc, (long) EncoderValue.Flush);
   resultTiff.SaveAdd(ep);
}

Ответ 3

Вы можете попробовать:

resultTiff = null;