Member 11856456 Ответов: 1

Процесс не может получить доступ к файлу, поскольку он используется другим процессом. Ошибка


Я получаю ошибку
System.IO.IOException: 'The process cannot access the file 'C:\Users\james\Desktop\chem\d70e1e925d85464e259cb8a7488aec78.png' because it is being used by another process.'


Я пытаюсь удалить картинку после загрузки ее в свою базу данных.

Вот мой код:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

       Dim Files As New OpenFileDialog
       Files.Filter = "Image(*.JPG;*.PNG;*.GIF)|*.jpg;*.png;*.gif"
       ' Allow the user to select multiple images.
       Files.Multiselect = True
       Files.Title = "Select an image"
       Files.ShowDialog()
       PictureBox1.Image = Image.FromFile(Files.FileName)

       Try
           Dim sqlcon As New SqlConnection("constring")
           Dim sqladapt = New SqlDataAdapter("Select * from [Table]", sqlcon)

           sqlcon.Open()
           Dim cmd As SqlClient.SqlCommand
           Dim sql As String = "insert into [Table] values(@ID,@Question,@Answers,@Howtowork,@Chapter,@img)"
           cmd = New SqlClient.SqlCommand(sql, sqlcon)

           Using ms As MemoryStream = New MemoryStream()

               Dim bm As Bitmap = New Bitmap(PictureBox1.Image)
               bm.Save(ms, PictureBox1.Image.RawFormat)

               Dim arrPic() As Byte = ms.GetBuffer()

               ' Make sure that all tables have the same type of information that can be entered, if not you will recieve an error.
               cmd.Parameters.AddWithValue("@ID", DataGridView1.Rows.Count)
               cmd.Parameters.AddWithValue("@Question", TextBox2.Text)
               cmd.Parameters.AddWithValue("@Answers", TextBox3.Text)
               cmd.Parameters.AddWithValue("@Howtowork", TextBox4.Text)
               cmd.Parameters.AddWithValue("@Chapter", ComboBox2.Text)
               cmd.Parameters.AddWithValue("@img", arrPic)
               cmd.ExecuteNonQuery()

               ms.Close()

           End Using

           sqlcon.Close()

           MessageBox.Show("New Record Added")

       Catch ex As Exception

       End Try

       TextBox2.Clear()
       TextBox3.Clear()
       TextBox4.Clear()

       refreshtable()

       System.IO.File.Delete(Files.FileName)


   End Sub


Что я уже пробовал:

Я пробовал ms.dispose, bm.dispose и picturebox1.dispose. Я полагал, что один из них отключится от файла раньше, чтобы я мог удалить его. Однако я все еще получаю ту же ошибку

1 Ответов

Рейтинг:
12

Richard Deeming

Это ограничение известно уже много лет:
Файл образа заблокирован, когда вы выберите элемент управления PictureBox свойство изображения в файл[^]

Заменять:

PictureBox1.Image = Image.FromFile(Files.FileName)
С:
Using fs As New IO.Stream(Files.FileName, IO.FileMode.Open, IO.FileAccess.Read)
    PictureBox1.Image = Image.FromStream(fs)
End Using


Member 11856456

Спасибо, я не мог понять, почему я не мог просто избавиться от информации, а затем удалить файл изображения после этого. Итак, никогда не используйте код Image.fromfile (), вместо этого сосредоточьтесь на использовании потока?

Richard Deeming

Да, вам вообще следует избегать Image.FromFile, так как он блокирует файл до тех пор, пока ваше приложение не закроется.

Как это часто бывает с Microsoft, эта ошибка "по замыслу". :)

Member 11856456

Спасибо, Ричард, я сохраню это в памяти. Еще раз спасибо за помощь.

turbozob

Работает. Спасибо