该进程无法访问该文件,因为它正在被使用
Posted
技术标签:
【中文标题】该进程无法访问该文件,因为它正在被使用【英文标题】:The process cannot access the file because it is being used 【发布时间】:2019-09-18 05:01:35 【问题描述】:只有第一次 Navigaterecods() 起作用,第二次调用它会抛出异常:
“该进程无法访问该文件,因为它正被另一个进程使用”
文件流每次都在 sub 内部关闭,但它抛出相同的异常。 你能帮我解决这个问题吗?
谢谢 MD希瓦拉姆
Public Sub NavigateRecords()
Try
Dim fstrmImage As New FileStream("ASPE-Pyramid.jpg", FileMode.Create)
Dim blob As Byte() = DirectCast(DS.Tables("Pyramid").Rows(inc).Item(1), Byte())
fstrmImage.Write(blob, 0, blob.Length)
fstrmImage.Close()
fstrmImage = Nothing
PictureBox1.Image = Image.FromFile("ASPE-Pyramid.jpg")
PictureBox1.SizeMode = PictureBoxSizeMode.StretchImage
PictureBox1.Refresh()
TextBox1.Text = DS.Tables("Pyramid").Rows(inc).Item(2).ToString
TextBox2.Text = DS.Tables("Pyramid").Rows(inc).Item(3).ToString
TextBox3.Text = DS.Tables("Pyramid").Rows(inc).Item(4).ToString
TextBox4.Text = DS.Tables("Pyramid").Rows(inc).Item(5).ToString
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub
【问题讨论】:
您应该将这些TextBoxes
绑定到您的 DataTable
而不是手动填充它们。
相当标准的故障模式,Image.FromFile() 使用内存映射文件对象锁定文件以优化图像访问。修复它的最简单方法是将语句替换为New Bitmap("ASPE-Pyramid.jpg")
,以便它在内存中复制图像数据。
您能简单介绍一下吗?我是 VB.NET 的新手。
你应该使用fstrmImage.Dispose()
,而不是设置为Nothing。
或者更好的是,将其包装在 Using
块中。
【参考方案1】:
Image.FromFile
方法会锁定文件,直到创建的 Image
对象被释放,正如文档中明确指出的那样。您没有处理Image
,因此文件保持锁定状态。在再次写入文件之前,您需要处置当前的 Image
对象(如果有的话)。
PictureBox1.Image?.Dispose()
Dim fstrmImage As New FileStream("ASPE-Pyramid.jpg", FileMode.Create)
如果您想避免这种情况,请调用PictureBox.Load
方法并传递文件路径。这根本不会锁定文件。
当然,你必须想知道为什么你需要创建一个文件。更好的选择是使用图像数据创建一个MemoryStream
并调用Image.FromStream
。请注意,只要您需要Image
,就需要保留MemoryStream
,这意味着在创建新的MemoryStream
之前处理掉以前的MemoryStream
,当您知道不需要时创建最后的MemoryStream
更多。
【讨论】:
我已经使用 Image.FromStream 更改了代码。但是,现在它在 menuitem_click 事件的最后一行(frm4.WindowState = FormWindowState.Maximized)显示错误。你能告诉我这是为什么吗? Private Sub PEProfileMenuItem_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PEProfileMenuItem.Click ActiveMdiChild.Close() Dim frm4 As New PEProfilefrm frm4.MdiParent = Me frm4.Show() frm4.WindowState = FormWindowState.Maximized End子 任何长度的代码都很难在评论中阅读,尤其是未格式化的。请用您的新代码更新您的问题并告诉我们错误是什么,而不仅仅是一个错误。 我已将代码更改为 Image.FromStream。现在好了。但在最后一行的 menuitem_click 事件中显示错误: (frm4.WindowState = FormWindowState.Maximized) 错误如下.. System.ArgumentException 未处理 Message="Parameter is not valid." Source="System.Drawing"。 代码已更改如下,但仍然显示错误: Dim MyImage As Image = Image.FromStream(fstrmImage) PictureBox1.Image = MyImage MyImage.Dispose() MyImage = Nothing 您是否错过了我说过不要在 cmets 中发布未格式化的代码而是更新您的问题的部分?以上是关于该进程无法访问该文件,因为它正在被使用的主要内容,如果未能解决你的问题,请参考以下文章
Android Studio:R.jar:该进程无法访问该文件,因为它正在被另一个进程使用
Python 2.7 easy_install - 该进程无法访问该文件,因为它正在被另一个进程错误使用
ZipFile.CreateFromDirectory 抛出 System.IO.IOException :该进程无法访问文件 X,因为它正在被另一个进程使用
IOException:该进程无法访问该文件,因为它正被另一个进程使用