Использование 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;