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

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

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

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

7 ответов


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

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

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

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

using (var stream = File.OpenRead(filename))
{
    image.BeginInit();
    image.CacheOption = BitmapCacheOption.OnLoad;
    image.StreamSource = stream;
    image.EndInit();
}

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

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

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

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

 // delete your file.

 File.Delete(delpath);

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

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!

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


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


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

MyDialog.AutoUpgradeEnabled = false;

я закомментировал эту строку и она была решена.