代码之家  ›  专栏  ›  技术社区  ›  OrElse

进程无法访问该文件,因为另一个进程正在使用该文件

  •  3
  • OrElse  · 技术社区  · 14 年前

    我正在通过以下代码将图像添加到FlowLayoutPanel控件

    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
    

    问题是我得到以下错误 The process cannot access the file xxxx because it is being used by another process. 当我尝试删除在上一步中加载的图像时。

                        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
    

    我在这里做错什么了?

    3 回复  |  直到 14 年前
        1
  •  5
  •   Konrad Rudolph    14 年前

    Image.FromFile actually locks the file it loads 只有释放锁后才会释放它。

    解决方案是将图像绘制到另一个图像图形上下文中(从而有效地复制它)并处理原始图像。

        2
  •  5
  •   OrElse    13 年前

    经过一番阅读,我也找到了另一个解决办法。

    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() 
    

    这是康拉德的建议。对于所有的新手,就像我一样:)

     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)
    

        3
  •  0
  •   Hassan Samara    11 年前

    我发现此解决方案是在图像文件加载到PictureBox后解锁图像文件的最佳方法:

    .负载( 带完整路径的图像文件名