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

时间:2014-06-02 18:09:23

标签: .net vb.net file delete-file

我正在使用VS2010编写一个WinForm应用程序& VS2012与.Net4。

在应用程序中,我将单个图像加载到图片框中,然后删除用户不想保留的图像。

每次我尝试删除这些"不需要的"图像我收到上面的错误信息:

  

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

以下内容用于将图像与删除不需要的图像的代码一起加载到动态创建的图片框中。

选项1:

加载图片:

picBox.Image = Image.FromFile(imgInfo.FullName).GetThumbnailImage(128, 128, Nothing, Nothing)

删除图片:

For Each imgFile As String In Directory.GetFiles(imgSharedFolder)
   File.Delete(imgFile)
Next imgFile

选项2:

由于将图像文件加载到图片框中会锁定"图像文件我通过将图像文件读入FileStream然后在将图像加载到图片框后关闭FileStream来尝试以下操作

负载:

fs = New System.IO.FileStream(imgInfo.FullName, IO.FileMode.Open, IO.FileAccess.Read)
picBox.Image = System.Drawing.Image.FromStream(fs).GetThumbnailImage(128, 128, Nothing, Nothing)
fs.Close()

删除:

Dim picList As String() = Directory.GetFiles(imgSharedFolder, "*.jpg")
For Each f As String In picList
   File.Delete(f)
Next f

我收到相同的错误消息。

选项3:

经过一些搜索,阅读和尝试之后,我遇到了这个建议来创建一个图像对象,然后在图像加载到图片框后处理图像对象:

负载:

Dim newImage As Image
newImage = Image.FromFile(imgInfo.FullName).GetThumbnailImage(128, 128, Nothing, Nothing)
picBox.Image = newImage

不幸的是,我收到了同样的错误消息。

这个问题有没有其他可能的解决办法,我可能忽略了什么?

1 个答案:

答案 0 :(得分:0)

以上是我上面发布的问题的解决方案。

虽然我正在将图像文件读入图片盒,但我忽略了提醒自己在将图像保存到数据库时我做了一个非常类似的过程。

只有在我开始分解将图像读入picbox并将其写入数据库之间所发生的一切之后,我才能找到解决问题的正确方法。

以下是将图像文件读入图片框的过程:

    For Each imgFile As String In Directory.GetFiles(fbdGetImagesOnDisk.SelectedPath)
       Try
          Dim fs As System.IO.FileStream
          imgInfo = New FileInfo(imgFile)
          If myext.Contains(LCase(imgInfo.Extension)) Then
             'Create dynamic picturebox
             picBox = New PictureBox()

             'Specify a valid picture file path
             fs = New System.IO.FileStream(imgInfo.FullName, IO.FileMode.Open, IO.FileAccess.Read)
             picBox.Image = System.Drawing.Image.FromStream(fs).GetThumbnailImage(128, 128, Nothing, Nothing)
             fs.Close()
   Catch ex as Exception
      msgbox(ex.message)
   End Catch
   Next imgFile

以下代码是在删除磁盘上的映像文件之前将映像从磁盘写入数据库。 重要提示:请注意fs.Close()的位置,因为如果它不正确,它将生成GDI +通用错误,并且无法删除最后一个图像。

Try
   conn.Open()
   'Create a FileStream for the image file on disk. This will allow us to Close the stream and release the file lock
   Dim fs As System.IO.FileStream
   'Specify a valid picture file path
   fs = New System.IO.FileStream(imgPath & "\" & imgName, IO.FileMode.Open, IO.FileAccess.Read)
   'Create an Image object to store the image.
   Dim img As Image = Image.FromStream(fs)
   'Create a Thumbnail object to store the Thumbnail of the image (128,128)
   Dim imgThumbnail As Image = Image.FromStream(fs).GetThumbnailImage(128, 128, Nothing, Nothing)
   'Create an empty stream in memory for the Image.
   Dim imgStream As New IO.MemoryStream
   'Create an empty stream in memory for the Thumbnail of the image
   Dim tmbStream As New IO.MemoryStream
   'Fill the stream with the binary data from the Image.
   img.Save(imgStream, Imaging.ImageFormat.Jpeg)
   'Fill the empty stream with the data of the Thumbnail
   imgThumbnail.Save(tmbStream, Imaging.ImageFormat.Jpeg)
   'Store Image memory stream as array
   Dim arrImage() As Byte = imgStream.GetBuffer()
   'Store Thumbnail memory stream as array
   Dim arrThumbnail() As Byte = tmbStream.GetBuffer()
   'Close the streams
   imgStream.Close()
   tmbStream.Close()
   'Close the File Stream
   **fs.Close()**

   With cmd
      .CommandText = SQLstr
      .Connection = conn
      .Parameters.Clear()
      .Parameters.AddWithValue("@imgName", imgName)
      .Parameters.AddWithValue("@imgImage", arrImage)
      .Parameters.AddWithValue("@imgThumbnail", arrThumbnail)
      .Parameters.AddWithValue("@patID", CInt(patID))
      .Parameters.AddWithValue("@conID", CInt(conID))
      .ExecuteNonQuery()
   End With

   Return True

Catch ex As Exception
   MsgBox(ex.Message)
   Return False
End Try
conn.Close() 'Close DB connection

在图像写入数据库之后,我们现在可以开始删除磁盘上的图像文件,而不会收到有关被锁定文件的任何错误消息。 这是在将数据写入数据库后从磁盘中删除映像文件的代码:

Try
   Dim picList As String() = Directory.GetFiles(imgSharedFolder, "*.jpg")
   For Each f As String In picList
      File.Delete(f)
   Next f
Catch ex As Exception
   MsgBox(ex.Message)
End Try

感谢那些回复的人,他们重申了这个过程背后的大量信息,以及为什么要以特定的方式完成。如果没有你的帮助和指导,我会被困一段时间。