web-dev-qa-db-fra.com

Supprimer un fichier utilisé par un autre processus

J'essaie de supprimer un fichier par programme, mais le fichier est apparemment utilisé par un autre processus (qui se trouve être mon programme). Fondamentalement, le programme charge des images à partir d'un dossier en utilisant FromUri pour créer un bitmap, qui est ensuite chargé dans un tableau d'images, qui à son tour devient l'enfant d'un panneau de pile. Pas très efficace, mais ça marche.

J'ai essayé d'effacer les enfants du panneau de pile et de rendre les images du tableau nulles, mais je reçois toujours l'IOException me disant que le fichier est utilisé par un autre processus.

Existe-t-il un autre moyen de supprimer le fichier des processus de mon application?

23
bramco

Afin de libérer un fichier image après le chargement, vous devez créer vos images en définissant le BitmapCacheOption.OnLoad drapeau. Une façon de procéder serait la suivante:

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

Bien que le paramètre BitmapCacheOption.OnLoad fonctionne sur une BitmapImage qui est chargée à partir d'un fichier local Uri, ceci n'est afaik nulle part documenté. Par conséquent, un moyen probablement meilleur ou plus sûr consiste à charger l'image à partir d'un FileStream, en définissant la propriété StreamSource au lieu de UriSource:

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

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

il peut s'agir d'un problème de récupération de place.

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

Une autre façon consiste à supprimer le fichier. Chargez votre fichier à l'aide de la classe FileStream et libérez un fichier via stream.Dispose (); il ne vous donnera jamais l'exception "Le processus ne peut pas accéder au fichier" car il est utilisé par un autre processus. "

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

 // delete your file.

 File.Delete(delpath);
7
Shahid Manzoor
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!
2
Eduardo Sobrinho