Check if a file is in use, wait for it to finish

12,073

Solution 1

It looks like you just need to add something like the following:

Process p = new Process();
p.StartInfo = startInfo;
p.WaitForExit();

Process.Start() starts another process but it doesn't wait for that process to finish before continuing on.

Solution 2

Description

You can use the method in my sample and do a while loop.

Sample

while (IsFileLocked(new FileInfo("YourFilePath")))
{
    // do something, for example wait a second
    Thread.Sleep(TimeSpan.FromSeconds(1));
}
// file is not locked

public static bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }
    return false;
}

Solution 3

Process process = Process.Start(startInfo);
process.WaitForExit(); // alteratively, you can use WaitForExit(int milliseconds)
File.Delete("Filename");  

Solution 4

This is a common problem. The solution is unfortunatley try to open it and see if there's an exception.

Use the IsFileLocked(...) from here:

Is there a way to check if a file is in use?

And do something like:

while ( IsFileLocked(new FileInfo(FilePath)) ) 
{ 
    Thread.Sleep(TimeInMiliSec); 
}
Share:
12,073
Dante1986
Author by

Dante1986

Updated on June 09, 2022

Comments

  • Dante1986
    Dante1986 almost 2 years

    I have this problem in my application:

    • Step 1 - create an file (xml) and put some content in it
    • Step 2 - a 3rd party application will open the file and get the info from the file made in step 1.
    • Step 3 - delete the file again.

    The first question that I have is about this part of the code:

    XmlDocument xmlDoc = new XmlDocument();
    DataSet ds = //use a method to put in the data
    xmlDoc.LoadXml(ds.GetXml());
    xmlDoc.Save("Filename");
    // ...
    Process.Start(startInfo);
    

    Is my assumption correct that the last line only gets executed when the above is already done? So I can be 100% sure that the data is all in the xml before it tries to start it right?

    The second part where I get an error now is here:

    Process.Start(startInfo);
    File.Delete("Filename");
    

    What happens now, is that the file already gets deleted before the 3rd party program had read it into its memory.

    Is there some way that I can check that the file is no longer in use, or make some stable way of waiting?

    I already found a way to use Thread.Sleep(TimeInMiliSec); but I guess this is not a correct way of doing this (more like a workaround solution)?

  • Dante1986
    Dante1986 over 12 years
    in case of a crash on the 3rd party program, will it also count as an exit ? because i can't really know what the user does in third 3rd party program, or how he exits there
  • Servy
    Servy over 12 years
    This is addressing the subject alone, not the fact that the code posted is accessing the same file from two processes rather than waiting for the process to end.
  • Servy
    Servy over 12 years
    @Dante1986 If the other process crashes WaitForExit will return, yes. If there are other programs touching the file then you'll be forced to use one of the other answers, but if you are only tripping over yourself then you should be doing something like this.
  • dknaack
    dknaack over 12 years
    This will wait as long the file can be deleted
  • gregwhitaker
    gregwhitaker over 12 years
    Just be careful with catching IOException with this code. If the file does not exist you could be stuck in a loop due to the fact that FileNotFoundException extends IOException.
  • Dante1986
    Dante1986 over 12 years
    is my assumption correct that the last line only gets executed when the above is already done ? so the start will only occur once the save is done ?
  • gregwhitaker
    gregwhitaker over 12 years
    @Dante1986 - Yes, XmlDocument.Save is a synchronous call. It will save the file before returning and executing your Process.Start.
  • dknaack
    dknaack over 12 years
    @Dante1986 The last line after the while loop occurs only if the file is not locked, yes