Как я могу загрузить изображение из файла, не блокируя его? - PullRequest
4 голосов
/ 11 мая 2011

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

pictureBox.Image = Image.FromFile( fileName );

Однако, файл остается заблокированным. Затем я попытался прочитать поток:

using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
    pictureBox.Image = Image.FromStream(fs);
} 

Это не блокирует файл, но делает причиной исключения позже; MSDN указывает, что поток должен оставаться открытым в течение всего времени жизни изображения. (Исключение включает в себя сообщение «Закрытый файл не может быть прочитан» или подобное.)

Как я могу загрузить изображение из файла, тогда у меня больше нет ссылок на файл?

Ответы [ 2 ]

9 голосов
/ 11 мая 2011

Извините, что отвечаю на свой вопрос, но я подумал, что это слишком полезно, чтобы скрывать от себя.

Хитрость заключается в том, чтобы скопировать данные из файлового потока в поток памяти перед загрузкой в ​​изображение.Тогда поток файла может быть безопасно закрыт.

using (System.IO.FileStream fs = new System.IO.FileStream(fileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
    System.IO.MemoryStream ms = new System.IO.MemoryStream();
    fs.CopyTo(ms);
    ms.Seek(0, System.IO.SeekOrigin.Begin);
    pictureBox.Image = Image.FromStream(ms);
} 
2 голосов
/ 10 октября 2014

Для тех, кто работает ниже Framework 4.0, вот что я сделал:

Using fs As New System.IO.FileStream(cImage, IO.FileMode.Open, IO.FileAccess.Read)
            Dim buffer(fs.Length) As Byte
            fs.Read(buffer, 0, fs.Length - 1)
            Using ms As New System.IO.MemoryStream
                ms.Write(buffer, 0, buffer.Length - 1)
                picID.Image = Image.FromStream(ms)
            End Using
        End Using
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...