Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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)?

like image 751
Dante1986 Avatar asked Dec 06 '22 16:12

Dante1986


1 Answers

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;
}
like image 119
dknaack Avatar answered Dec 25 '22 07:12

dknaack