Подтвердить что ты не робот

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

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

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

Есть ли другой способ удалить файл из моих процессов приложения?

4b9b3361

Ответ 1

Чтобы выпустить файл изображения после загрузки, вам необходимо создать свои изображения, установив флаг BitmapCacheOption.OnLoad. Один из способов сделать это:

string filename = ...
BitmapImage image = new BitmapImage();
image.BeginInit();
image.CacheOption = BitmapCacheOption.OnLoad;
image.UriSource = new Uri(filename);
image.EndInit();

Несмотря на то, что установка BitmapCacheOption.OnLoad работает с BitmapImage, загружаемым из локального файла Uri, это нигде не зарегистрировано. Поэтому, вероятно, лучше или безопаснее загрузить изображение из FileStream, установив свойство StreamSource вместо UriSource:

string filename = ...
BitmapImage image = new BitmapImage();

using (var stream =
    new FileStream(filename, FileMode.Open, FileAccess.Read, FileShare.Read))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}

Ответ 2

это может быть проблема с сборкой мусора.

System.GC.Collect(); 
System.GC.WaitForPendingFinalizers(); 
File.Delete(picturePath);

Ответ 3

Другой способ - удалить файл. Загрузите файл с помощью класса FileStream и отпустите файл через stream.Dispose(); он никогда не даст вам исключение "Процесс не может получить доступ к файлу", потому что он используется другим процессом.

using (FileStream stream = new FileStream("test.jpg", FileMode.Open, FileAccess.Read))
{
    pictureBox1.Image = Image.FromStream(stream);
     stream.Dispose();
}

 // delete your file.

 File.Delete(delpath);

Ответ 4

Извини, мой плохой английский. Я надеюсь помочь:

var uploadedFile = Request.Files[0]; //Get file
var fileName = Path.GetFileName(uploadedFile.FileName);  //get file name
string fileSavePath = Server.MapPath(fileName); //get path
uploadedFile.SaveAs(fileSavePath); //saving file
FileInfo info = new FileInfo(fileSavePath);//get info file
//the problem ocurred because this, 
FileStream s = new FileStream(fileSavePath, FileMode.Open); //openning stream, them file in use by a process
System.IO.File.Delete(fileSavePath); //Generete a error
//problem solved here...
s.Close();
s.Dispose();
System.IO.File.Delete(fileSavePath); //File deletad sucessfully!

Ответ 5

с моей точки зрения, общий ответ состоял в том, чтобы отменить объект, который сохраняет открытый процесс с файлом, который вы хотите удалить. В моем случае это MailMessage, но также может быть потоком, файловым потоком и т.д., Которые вам нужно утилизировать.

Ответ 6

У меня была аналогичная проблема. Единственное различие заключалось в том, что я использовал Binding (MVVM Pattern). Ничего особенного не удалось, я удалил все и попробовал с Binding Mode=OneWay вместе с GC.Collect() перед вызовом File.Delete(path), и он работал наконец.

Ответ 7

У меня была такая же проблема. Проблема у меня была с openFileDialog и saveFileDialog со следующим набором:

MyDialog.AutoUpgradeEnabled = false;

Я прокомментировал эту строку, и она была решена.