Почему действительно Отображает. FromFile сохраняют дескриптор файла открытым иногда?

Вы можете использовать объединение в подзапросе

    select m.EmployeeId 
    from my_table  m
    inner join  
    (
        select min(task_count) min_task
        from my_table 
    ) t  on t.min_task = m.task_count
.
20
задан Simon_Weaver 25 April 2009 в 06:18
поделиться

6 ответов

Я прошел через то же путешествие, что и несколько других авторов этой темы. На заметку:

  1. Использование Image.FromFile действительно кажется непредсказуемым, когда он освобождает дескриптор файла. Вызов Image.Dispose () не освобождает дескриптор файла во всех случаях.

  2. Использование FileStream и метода Image.FromStream работает и освобождает дескриптор файла, если вы вызываете Dispose () в FileStream или оберните все это в инструкцию Using {}, как рекомендовано Крисом. Однако, если вы затем попытаетесь сохранить объект Image в поток, метод Image.Save вызовет исключение «Общая ошибка произошла в GDI +» . Предположительно что-то в методе Save хочет знать о исходном файле.

  3. Подход Стивена сработал для меня. Мне удалось удалить исходный файл с объектом Image в памяти. Я также смог сохранить изображение как в потоке, так и в файле (мне нужно было сделать и то, и другое). Я также смог сохранить в файл с тем же именем, что и исходный файл, что-то, что задокументировано как невозможное, если вы используете метод Image.FromFile (я нахожу это странным, поскольку, безусловно, это наиболее вероятный вариант использования, но эй .)

Итак, чтобы подвести итог, откройте свое изображение следующим образом:

Image img = Image.FromStream(new MemoryStream(File.ReadAllBytes(path)));

Затем вы можете манипулировать им (и исходным файлом) по своему усмотрению.

35
ответ дан 29 November 2019 в 23:02
поделиться

I have had the same problem and resorted to reading the file using

return Image.FromStream(new MemoryStream(File.ReadAllBytes(fileName)));

14
ответ дан 29 November 2019 в 23:02
поделиться

Image.FromFile сохраняет дескриптор файла открытым, пока изображение не будет удалено. Из MSDN :

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

Используйте Image.FromStream, и у вас не возникнет проблема.

using(var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    return Image.FromStream(fs);
}

Редактировать: (год и чуть позже)

Приведенный выше код опасен, так как он непредсказуем, в некоторый момент времени (после закрытия файлового потока) вы можете получить dreaded «Произошла общая ошибка в GDI +» . Я хотел бы изменить его на:

Image tmpImage;
Bitmap returnImage;

using(var fs = new FileStream(filename, FileMode.Open, FileAccess.Read))
{
    tmpImage = Image.FromStream(fs);
    returnImage = new Bitmap(tmpImage);
    tmpImage.Dispose();
}

return returnImage;
5
ответ дан 29 November 2019 в 23:02
поделиться

Make sure you are Disposing properly.

using (Image.FromFile("path")) {}

The using expression is shorthand for

IDisposable obj;
try { }
finally 
{
    obj.Dispose();
}

@Rex in the case of Image.Dispose it calls GdipDisposeImage extern / native Win32 call in it's Dispose().

IDisposable is used as a mechanism to free unmanaged resources (Which file handles are)

1
ответ дан 29 November 2019 в 23:02
поделиться

I would have to point my finger at the Garbage Collector. Leaving it around is not really the issue if you are at the mercy of Garbage Collection.

This guy had a similar complaint... and he found a workaround of using a FileStream object rather than loading directly from the file.

public static Image LoadImageFromFile(string fileName)
{
    Image theImage = null;

    fileStream = new FileStream(fileName, FileMode.Open, FileAccess.Read);
    {
        byte[] img;
        img = new byte[fileStream.Length];
        fileStream.Read(img, 0, img.Length);
        fileStream.Close();
        theImage = Image.FromStream(new MemoryStream(img));
        img = null;
    }

...

It seems like a complete hack...

0
ответ дан 29 November 2019 в 23:02
поделиться

Как упоминалось выше, работа Microsoft вызывает ошибку GDI + после загрузки нескольких изображений. Решение VB для меня, как упомянуто выше Стивеном, это

picTemp.Image = Image.FromStream(New System.IO.MemoryStream(My.Computer.FileSystem.ReadAllBytes(strFl)))
0
ответ дан 29 November 2019 в 23:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: