Darrell de Wet Ответов: 1

Как определить "файл, используемый другим процессом"


Всем доброе утро.

Я читаю вложение (файл JPEG) из базы данных Access (.accdb).

Пользователь выбирает драйвер из выпадающего списка, а затем программа переходит к получению изображения водительских прав. Во второй раз, когда пользователь выбирает заданное имя драйвера, программа выходит из строя с надписью “файл используется другим процессом”, когда я пытаюсь удалить сохраненное имя файла. (См. маркер в коде)

Private Sub GetLicenceImages(ByVal theDriver As String, theLicence As String)
    Dim engine As New Dao.DBEngine
    Dim database As Dao.Database = engine.OpenDatabase(CommonDBPath, False, False, "MS Access;PWD=xxxxxxx")

    Dim rs As Dao.Recordset = database.OpenRecordset("Select HRL_Licence_Image From HR_Licences WHERE HRL_Name_Surname = '" & theDriver & "' AND HRL_Licence_Type = '" & theLicence & "'")

    While Not rs.EOF
        Dim rs1 As Dao.Recordset2 = CType(rs.Fields("HRL_Licence_Image").Value, Recordset2)
        While Not rs1.EOF
            DriversLicencePicPath = LocalTempPath & rs1("FileName").Value.ToString
            Dim fld As Dao.Field2 = CType(rs1("FileData"), Field2)

            System.IO.File.Delete(DriversLicencePicPath)   '<===== CRASH OCCURS HERE

            fld.SaveToFile(DriversLicencePicPath)

            '--------------------------------
            Dim img As Image = Image.FromFile(DriversLicencePicPath)
            but_Driver_Licence.BackgroundImage = img
            but_Driver_Licence.Text = ""
            but_Delete_Drivers_Pic.Visible = True
            '--------------------------------

            rs1.MoveNext()

        End While

        rs.MoveNext()

    End While

    rs.Close()

End Sub


Процесс, который использует файл, - это эта программа, и я понятия не имею, что нужно закрыть или утилизировать (или что-то другое), чтобы показать изображение во второй раз.

Любой совет или руководство будут очень признательны.

С уважением и благодарностью.

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

Я удалил изображение из but_Driver_Licence.Кнопка BackgroundImage перед входом в эту процедуру.
Не знаю, что еще делать.

1 Ответов

Рейтинг:
10

OriginalGriff

Цитата:
Я удалил изображение из but_Driver_Licence.Кнопка BackgroundImage перед входом в эту процедуру.

Это не означает, что файл освобожден. Если вы загрузили изображение из файла с помощью Image.FromFile, то документация довольно ясна: Изображение.Метод FromFile (String, Boolean) (System.Рисование)[^]
Цитата:
Файл остается заблокированным до тех пор, пока изображение не будет удалено.
Это означает, что до тех пор, пока ваш код явно не вызвал Dispose для самого экземпляра класса Image, файл не может быть записан, перемещен или удален.
Когда вы удаляете его из кнопки, утилизируйте его - или лучше, когда вы загружаете файл в изображение, скопируйте его в новое растровое изображение и утилизируйте оригинал так, чтобы период блокировки был как можно короче.

И не делайте доступ к базе данных таким образом: никогда не объединяйте строки для построения SQL-команды. Это оставляет вас широко открытыми для случайной или преднамеренной атаки SQL-инъекции, которая может уничтожить всю вашу базу данных. Вместо этого используйте параметризованные запросы.


Darrell de Wet

Спасибо.
Вы уже несколько раз помогали мне, и я очень ценю Ваши советы.

OriginalGriff

Пожалуйста!