图像由另一个进程错误使用的vb.net文件

时间:2010-01-28 16:30:43

标签: vb.net picturebox image

我正在编写一个小程序,我通过打开文件对话框选择图片。当我选择一张图片时,我希望它覆盖当前图片并显示新图像。现在我选择具有不同扩展名的图像没有任何问题。因此,当我目前有一个.png时,我可以选择一个.jpg但是当我选择一个与当前图像具有相同扩展名的图像时,我收到一个错误: 该进程无法访问文件'C:\ Users .... \ woontypeimages \ chalet_foto.jpg',因为它正由另一个进程使用。

    If ofd.ShowDialog() = Windows.Forms.DialogResult.OK Then
        Dim sFilename As String = cboWoningtypesWoningtype.SelectedItem.ToString & "_foto" & System.IO.Path.GetExtension(ofd.FileName)
        System.IO.File.Copy(ofd.FileName, Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Camping Relaxx\woontypeimages\" & sFilename, True)
        txtWoningtypesFoto.Text = sFilename
        updateImages()
    End If

    Private Sub updateImages()

    Try
        picFoto.Image = Nothing
        txtWoningtypesFoto.BackColor = clrReadonly
        txtWoningtypesFoto.ForeColor = Color.Black
        picFoto.Image = System.Drawing.Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Camping Relaxx\woontypeimages\" & txtWoningtypesFoto.Text)
    Catch ex As Exception
        txtWoningtypesFoto.BackColor = clrError
        txtWoningtypesFoto.ForeColor = Color.White
    End Try
    Try
        picGrondplan.Image = Nothing
        txtWoningtypesGrondplan.BackColor = clrReadonly
        txtWoningtypesGrondplan.ForeColor = Color.Black
        picGrondplan.Image = System.Drawing.Image.FromFile(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) & "\Camping Relaxx\woontypeimages\" & txtWoningtypesGrondplan.Text)
    Catch ex As Exception
        txtWoningtypesGrondplan.BackColor = clrError
        txtWoningtypesGrondplan.ForeColor = Color.White
    End Try

End Sub

如果有人能帮助我,我会很高兴

提前致谢

2 个答案:

答案 0 :(得分:1)

使用这些:

picFoto.Image.Dispose()
picGrondplan.Image.Dispose()

而不是:

picFoto.Image = Nothing
picGrondplan.Image = Nothing

Image.FromFile方法在源文件上保持锁定,直到图像被处理完毕。将对象设置为空不会立即处理它 - 垃圾收集器将在其自己的时间内处理它(这可能不会直到您关闭带有图片框的表单)。需要处置以立即释放文件句柄。

答案 1 :(得分:1)

您可以使用PictureBox的Load(string)方法而不是担心Dispose(),而不会锁定文件。

Me.PictureBox1.Load("C:\test.png")