46

I'm trying to programmically delete a file, but the file is apparently being used by another process (which happens to be my program). Basically, the program loads images from a folder by using FromUri to create a Bitmap, which is then loaded into an Image array, which in turn becomes the child of a stackpanel. Not very efficient, but it works.

I've tried clearing the stackpanel's children, and making the images in the array null, but I'm still getting the IOException telling me that the file is being used by another process.

Is there some other way to remove the file from my application's processes?

2
  • 1
    Are you disposing the images? Setting them null means their handles won't be closed until they're garbage collected. Commented Nov 7, 2012 at 3:28
  • 4
    Show your code for loading them. If you've got dangling root's to them they'll still be open. Commented Nov 7, 2012 at 3:30

7 Answers 7

151

it may be Garbage Collection issue.

System.GC.Collect(); System.GC.WaitForPendingFinalizers(); File.Delete(picturePath); 
Sign up to request clarification or add additional context in comments.

6 Comments

Annoyingly(!?) this actually worked. Tried everything else, including the retry pattern, yet these two lines are the ones that did it.
this should be the real answer.
If this answer works for you, it's probably because you did not close a FileStream. The garbage collector will call the finalizer ~FileStream(), which in turn will call its own Dispose() method, which in turn releases the file handle (see the source code.)
this was correct! thank you mike
It helped me and saved my time .
spent all day and this is the only correct answer!
30

In order to release an image file after loading, you have to create your images by setting the BitmapCacheOption.OnLoad flag. One way to do this would be this:

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

Although setting BitmapCacheOption.OnLoad works on a BitmapImage that is loaded from a local file Uri, this is afaik nowhere documented. Therefore a probably better or safer way is to load the image from a FileStream, by setting the StreamSource property instead of UriSource:

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

Comments

15

Another way is to delete file. Load your file using FileStream class and release an file through stream.Dispose(); it will never give you the Exception "The process cannot access the file '' because it is being used by another process."

using (FileStream stream = new FileStream("test.jpg", FileMode.Open, FileAccess.Read)) { pictureBox1.Image = Image.FromStream(stream); stream.Dispose(); } // delete your file. File.Delete(delpath); 

1 Comment

apparently this will give exceptions if you try to manipulate, clone or even save the image later, though.
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! 

Comments

-1

I had the similar issue. The only difference was that I was using Binding(MVVM Pattern). Nothing much worked then I removed everything and tried with Binding Mode=OneWay along with GC.Collect() before calling File.Delete(path) and it worked finally.

Comments

-1

I had the same issue. The problem I had was with the openFileDialog and saveFileDialog having the following set:

MyDialog.AutoUpgradeEnabled = false;

I commented out that line and it was resolved.

Comments

-2

In my case, I started a new process of devenv.exe opening a temporary solution file. After the process was ended, I found I could not delete the directory for few minutes. Checking with "resmon", resource monitor, I found it was a executable called PerfWatson2.exe that was using the temp file. Looking at the site, PerfWatson is actually a Visual Studio Customer Experience Improvement Program from MicroSoft. It will lock the file or directory you temporarily used even after you have ended the VS IDE. The solution is to disable the Visual Studio Customer Experience Improvement Program, see this. This shoudln't be an issue after your app is publihsed. But it is quite annoying during debuging.

1 Comment

This does not provide an answer to the question. Once you have sufficient reputation you will be able to comment on any post; instead, provide answers that don't require clarification from the asker. - From Review

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.