该进程无法访问该文件,因为它正在被使用

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:该进程无法访问该文件,因为它正被另一个进程使用

System.IO.IOException: '该进程无法访问该文件,因为它正被另一个进程使用

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