O processo não pode acessar o arquivo porque está sendo usado por outro processo
-
25-09-2019 - |
Pergunta
Estou adicionando imagens a um controle FlowLayOutPanel através do seguinte código
Dim WithEvents Pedit As DevExpress.XtraEditors.PictureEdit
Private Sub LoadImagesCommon(ByVal fi As FileInfo)
Pedit = New DevExpress.XtraEditors.PictureEdit
Pedit.Width = 133
Pedit.Height = 98
Pedit.Image = Image.FromFile(fi.FullName)
Pedit.Properties.SizeMode = DevExpress.XtraEditors.Controls.PictureSizeMode.Zoom
Pedit.ToolTip = fi.Name
AddHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
AddHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
AddHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
FlowLayoutPanel1.Controls.Add(Pedit)
End Sub
O problema é que recebo o seguinte erro The process cannot access the file xxxx because it is being used by another process.
Quando tento excluir as imagens que carreguei na etapa anterior.
FlowLayoutPanel1.Controls.Clear()
FlowLayoutPanel1.Refresh()
For Each fi As FileInfo In New DirectoryInfo(My.Settings.TempDirectory).GetFiles
RemoveHandler Pedit.MouseClick, AddressOf Pedit_MouseClick
RemoveHandler Pedit.MouseEnter, AddressOf Pedit_MouseEnter
RemoveHandler Pedit.MouseLeave, AddressOf Pedit_MouseLeave
File.Delete(fi.FullName)
Next
Então, o que estou fazendo de errado aqui?
Solução
Image.FromFile
Na verdade, bloqueia o arquivo que ele carrega e apenas libera a trava depois de descartada.
A solução é atrair a imagem para o contexto gráfico de outra imagem (copiando -a efetivamente) e descartar a imagem original.
Outras dicas
AHA! Obrigado Konrad.
Depois de uma leitura, também encontrei outra solução alternativa.
Dim fs As System.IO.FileStream
fs = New System.IO.FileStream(fi.FullName, IO.FileMode.Open, IO.FileAccess.Read)
Pedit.Image = System.Drawing.Image.FromStream(fs)
fs.Close()
Atualizar:E aqui está o que Konrad sugeriu. Para todos os novatos por aí, assim como eu :)
Dim imgTemp As System.Drawing.Image
imgTemp = System.Drawing.Image.FromFile(strFilename, True)
Pedit.Image = New System.Drawing.Bitmap(imgTemp)
imgTemp.Dispose()
Pedit.Image.Save(strFilename)
O que é melhor, pois o objeto de imagem não pode ter seu método de salvamento chamado após o fechamento do FileStream.
Descobri que esta solução é a melhor para desbloquear o arquivo de imagem depois de ser carregado no PictureBox:
PictureBoxName.CARREGAR(Nome do arquivo de imagem com caminho completo)