Приложение .NET блокирует файл - PullRequest
0 голосов
/ 03 февраля 2010

Хорошо, я действительно новичок в разработке VB.NET и настольных приложений. Упрощенно это то, что происходит в моем приложении:

Dim Files() As New List(Of IO.FileInfo)
Files.Add( (New IO.FileInfo("C:\img1.jpg")) )
Files.Add( (New IO.FileInfo("C:\img2.jpg")) )
'Picture is a Windows.Forms.PictureBox in my WinForm '
Picture.Image = New System.Drawing.Bitmap(Files(0).FullName)
Picture.image = Nothing
CurrentFile = Files(0)
'Show next pic (img2)'
Files.RemoveAt(0)
Picture.Image = New System.Drawing.Bitmap(Files(0).FullName)
'Move img1 to other location '
CurrentFile.MoveTo("C:\other\img1.jpg")

В последней строке будет выдано исключение о том, что img1 нельзя переместить, поскольку он используется. Таким образом, мое приложение все еще использует его, но как заставить мое приложение перестать блокировать файл? Нет ничего, что могло бы на это ссылаться (насколько я вижу)

Ответы [ 2 ]

6 голосов
/ 03 февраля 2010

Виновной стороной является растровое изображение. Конструктор Bitmap(string) приводит к тому, что Bitmap удерживает блокировку файла до тех пор, пока Bitmap не будет удален. См. Примечания в документации :

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

Чтобы устранить проблему, либо удалите Bitmap (если вы с ним покончили), либо вручную загрузите байты из файла в MemoryStream из файла и загрузите Bitmap из MemoryStream. (Опять же, конструктор Bitmap(Stream) требует, чтобы Stream оставался открытым, поэтому вы не можете обойтись без простого создания FileStream поверх файла; вам нужно загрузить байты в память и хранить MemoryStream, пока вы не закончили Растровое изображение.)

3 голосов
/ 03 февраля 2010

Это из-за GDI +. Смотрите здесь для решения и объяснения: http://gabrielmagana.com/2009/05/c-working-with-images-image-files-and-pictureboxes/

...