System.IO.IOException: file used by another process

151,350

Solution 1

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;
    }
}

Solution 2

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.

Solution 3

The code works as best I can tell. I would fire up Sysinternals process explorer and find out what is holding the file open. It might very well be Visual Studio.

Solution 4

After coming across this error and not finding anything on the web that set me right, I thought I'd add another reason for getting this Exception - namely that the source and destination paths in the File Copy command are the same. It took me a while to figure it out, but it may help to add code somewhere to throw an exception if source and destination paths are pointing to the same file.

Good luck!

Solution 5

It worked for me.

Here is my test code. Test run follows:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            FileInfo f = new FileInfo(args[0]);
            bool result = modifyFile(f, args[1],args[2]);
        }
        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(originalPath + ".tmp", originalPath, true); 
                result = true; 
            } 
            catch (Exception ex) 
            { 
                Console.WriteLine(ex); 
            } 
            return result; 
        }
    }
}


C:\testarea>ConsoleApplication1.exe file.txt padding testing
input :         <style type="text/css">
        <!--
         #mytable {
          border-collapse: collapse;
          width: 300px;
         }
         #mytable th,
         #mytable td
         {
          border: 1px solid #000;
          padding: 3px;
         }
         #mytable tr.highlight {
          background-color: #eee;
         }
        //-->
        </style>
replaced String         <style type="text/css">
        <!--
         #mytable {
          border-collapse: collapse;
          width: 300px;
         }
         #mytable th,
         #mytable td
         {
          border: 1px solid #000;
          testing: 3px;
         }
         #mytable tr.highlight {
          background-color: #eee;
         }
        //-->
        </style>
Share:
151,350

Related videos on Youtube

srodriguez
Author by

srodriguez

Open Source enthusiast

Updated on July 09, 2022

Comments

  • srodriguez
    srodriguez almost 2 years

    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,

  • Sam Saffron
    Sam Saffron almost 15 years
    +1 the whole complex dispose close, flush streamreader thingy (not using using statement etc.. etc..) makes me shiver. its making a simple problem into a hugh unmaintainable mess.
  • nalply
    nalply about 11 years
    I don't believe you that it works in any case. For example, try to write to a PDF file held open by Adobe Reader.
  • illinoistim
    illinoistim over 10 years
    Thank you for this. I had been searching for an answer for a similar situation. I had already closed the XMLWriter, but it was still giving me the error. Once I put the statement inside of a try-catch, it stopped giving me the error.
  • Eric Wu
    Eric Wu over 8 years
    I can't see how this post can be called an answer if it does not explain anything at all.
  • T_D
    T_D over 8 years
    @SamSaffron Let's not judge other peoples code without proper research, MSDN says "Given a string and a file path, this method opens the specified file, writes the string to the file, and then closes the file."
  • Yuval Levy
    Yuval Levy over 7 years
    can someone explain how this code helps avoid the problem in the first place?
  • si618
    si618 about 7 years
    @YuvalLevy This code doesn't rely on creating a temporary file. This could help avoid file lock problem or if an external process is interfering. You could try and replicate the original problem, however, this code fixed the issue at hand, and is easier to maintain, so good enough for me! :)
  • Faisal Arshad
    Faisal Arshad over 6 years
    FS.Dispose(); is releasing the resources
  • eran otzap
    eran otzap almost 6 years
    but they need to be. it'S THE SAME FILE
  • eran otzap
    eran otzap almost 6 years
    Interesting, do you think it applies to streamer streamerwriter as well ?