好吧,我是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因为正在使用而无法移动。所以我的应用程序仍在使用它,但如何让我的应用程序停止锁定文件?没有什么可以保留它(据我所知)
答案 0 :(得分:6)
有罪方是Bitmap。 Bitmap(string)
构造函数确实导致Bitmap对文件进行锁定,直到释放Bitmap为止。请参阅remarks in the docs:
文件保持锁定状态,直到丢弃位图。
要解决此问题,请先处理Bitmap(如果已完成),或者手动将文件中的字节从文件加载到MemoryStream中,然后从MemoryStream中加载Bitmap。 (同样,Bitmap(Stream)
构造函数要求Stream保持打开状态,因此您无法在文件上创建FileStream;您需要将字节加载到内存中,并保持MemoryStream,直到您拥有完成了Bitmap。)
答案 1 :(得分:3)
这是因为GDI +。在这里寻找解决方案和解释:http://gabrielmagana.com/2009/05/c-working-with-images-image-files-and-pictureboxes/