Исключение The process cannot access the file because it is being used by another process

C#, Windows Forms, SQLite

В форме есть метод ChangeProfileImage(), который по клику на PictureBox вызывает OpenFileDialog, позволяя выбрать фото профиля (аватар) на диске, после чего PictureBox отображает этот файл, сам файл сохраняется в папку %appdata%\LibraryApp\avatars, а имя файла записывается в БД (через вызов статического метода AccountActions.SetImagePathData()

private void ChangeProfileImage(object sender, EventArgs e)
{
    // opening the file dialog
    libraryManagerOpenFileDialog.FileName = "Image";
    libraryManagerOpenFileDialog.Filter = "PNG (*.png)|*.png";
    libraryManagerOpenFileDialog.Title = "Выберите файл с изображением";

    if (libraryManagerOpenFileDialog.ShowDialog() == DialogResult.Cancel)
        return;

    // saving the image to the PictureBox
    libraryManagerPictureBox.BackgroundImage = null;

    libraryManagerPictureBox.Image = new Bitmap(libraryManagerOpenFileDialog.FileName);

    libraryManagerPictureBox.SizeMode = PictureBoxSizeMode.Zoom;
    libraryManagerPictureBox.Update();

    // the name of the file to save
    string fileName = account.Login + ".png";

    // the saving path
    string savePath = Environment.ExpandEnvironmentVariables(@"%appdata%\LibraryApp\avatars\") + fileName;

    if (libraryManagerPictureBox.Image is not null)
    {
        try
        {
            // if a file with the same name already exists, delete it
            if (File.Exists(savePath))
                File.Delete(savePath);

            // saving the file
            libraryManagerPictureBox.Image.Save(savePath, System.Drawing.Imaging.ImageFormat.Png);
            AccountActions.SetImagePathData(command, fileName, account.LoginId);
        }
        catch
        {
            MessageBox.Show("Невозможно сохранить изображение профиля", "Ошибка",
            MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }
}


public static void SetImagePathData(SqliteCommand command, string path, int LoginId)
{
    string query = "UPDATE Accounts SET ImagePath = @Path WHERE LoginId = @LoginId;";

    try
    {
        command = DataBase.GetConnection().CreateCommand();
        command.CommandText = query;
        command.Parameters.AddWithValue("@Path", path);
        command.Parameters.AddWithValue("@LoginId", LoginId);

        DataBase.OpenConnection();
        command.ExecuteNonQuery();
    }
    catch (Exception ex)
    {
        MessageBox.Show($"Не удалось создать запись в таблице Accounts. Ошибка:\n\"{ex.Message}\"\n" +
                        $"Обратитесь к системному администратору для её устранения.",
                        "Ошибка при работе с базой данных", MessageBoxButtons.OK, MessageBoxIcon.Stop);
    }

    DataBase.CloseConnection();
}

И всё работает, сохранение (и перезапись) файла происходит, в базу данных информация тоже пишется. Проблема в том, что после перезапуска программы при попытке перезаписать тот же файл аватарки файл занят другим процессом. Если файл с базой данных заменить, то перезапись файла работает. Подскажите, где может быть утечка памяти? И что сделать?


Ответы (0 шт):