Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

System.IO.IOException: file used by another process

I've been working on this small piece of code that seems trivial but still, i cannot really see where is the problem. My functions do a pretty simple thing. Opens a file, copy its contents, replace a string inside and copy it back to the original file (a simple search and replace inside a text file then). I didn't really know how to do that as I'm adding lines to the original file, so I just create a copy of the file, (file.temp) copy also a backup (file.temp) then delete the original file(file) and copy the file.temp to file. I get an exception while doing the delete of the file. Here is the sample code:

private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod)     {         Boolean result = false;         FileStream fs = new FileStream(file.FullName + ".tmp", FileMode.Create, FileAccess.Write);         StreamWriter sw = new StreamWriter(fs);          StreamReader streamreader = file.OpenText();         String originalPath = file.FullName;         string input = streamreader.ReadToEnd();         Console.WriteLine("input : {0}", input);          String tempString = input.Replace(extractedMethod, modifiedMethod);         Console.WriteLine("replaced String {0}", tempString);          try         {             sw.Write(tempString);             sw.Flush();             sw.Close();             sw.Dispose();             fs.Close();             fs.Dispose();             streamreader.Close();             streamreader.Dispose();              File.Copy(originalPath, originalPath + ".old", true);             FileInfo newFile = new FileInfo(originalPath + ".tmp");             File.Delete(originalPath);             File.Copy(fs., originalPath, true);              result = true;         }         catch (Exception ex)         {             Console.WriteLine(ex);         }          return result;     }` 

And the related exception

System.IO.IOException: The process cannot access the file 'E:\mypath\myFile.cs' because it is being used by another process.    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)    at System.IO.File.Delete(String path)    at callingMethod.modifyFile(FileInfo file, String extractedMethod, String modifiedMethod) 

Normally these errors come from unclosed file streams, but I've taken care of that. I guess I've forgotten an important step but cannot figure out where. Thank you very much for your help,

like image 297
srodriguez Avatar asked Jun 22 '09 03:06

srodriguez


People also ask

How do you fix because it is being used by another process?

Windows Update Code 0x80070020 The existing process cannot access the file because it is being used by another process. To fix this error, you will need to use the MSCONFIG tool to get the PC into a clean boot state and then try to update it again.

What is System IO IOException?

IOException is the base class for exceptions thrown while accessing information using streams, files and directories. The Base Class Library includes the following types, each of which is a derived class of IOException : DirectoryNotFoundException. EndOfStreamException. FileNotFoundException.

How do you know if a file is being used by another process C#?

Solution 1 First check if the file exists (File. Exists) if so try to open for write within try and catch block, if exception is generated then it is used by another process.


2 Answers

Sounds like an external process (AV?) is locking it, but can't you avoid the problem in the first place?

private static bool modifyFile(FileInfo file, string extractedMethod, string modifiedMethod) {     try     {         string contents = File.ReadAllText(file.FullName);         Console.WriteLine("input : {0}", contents);         contents = contents.Replace(extractedMethod, modifiedMethod);         Console.WriteLine("replaced String {0}", contents);         File.WriteAllText(file.FullName, contents);         return true;     }     catch (Exception ex)     {         Console.WriteLine(ex.ToString());         return false;     } } 
like image 74
si618 Avatar answered Sep 23 '22 05:09

si618


I realize that I is kinda late, but still better late than never. I was having similar problem recently. I used XMLWriter to subsequently update XML file and was receiving the same errors. I found the clean solution for this:

The XMLWriter uses underlying FileStream to access the modified file. Problem is that when you call XMLWriter.Close() method, the underlying stream doesn't get closed and is locking the file. What you need to do is to instantiate your XMLWriter with settings and specify that you need that underlying stream closed.

Example:

XMLWriterSettings settings = new Settings(); settings.CloseOutput = true; XMLWriter writer = new XMLWriter(filepath, settings); 

Hope it helps.

like image 26
roquen Avatar answered Sep 24 '22 05:09

roquen