Удалить файл, используемый другим процессом
Я пытаюсь программно удалить файл, но файл, по-видимому, используется другим процессом (который, случается, является моей программой). В принципе, программа загружает изображения из папки с помощью 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;
я закомментировал эту строку и она была решена.