Исключение 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();
}
И всё работает, сохранение (и перезапись) файла происходит, в базу данных информация тоже пишется. Проблема в том, что после перезапуска программы при попытке перезаписать тот же файл аватарки файл занят другим процессом. Если файл с базой данных заменить, то перезапись файла работает. Подскажите, где может быть утечка памяти? И что сделать?