检查文件是否正在使用,等待其完成。

6
我在我的应用程序中遇到了这个问题:
  • 第一步 - 创建一个文件(xml)并将一些内容放入其中
  • 第二步 - 第三方应用程序将打开该文件并获取在第一步制作的文件中的信息。
  • 第三步 - 再次删除该文件。
我对代码的这部分有一个问题:
XmlDocument xmlDoc = new XmlDocument();
DataSet ds = //use a method to put in the data
xmlDoc.LoadXml(ds.GetXml());
xmlDoc.Save("Filename");
// ...
Process.Start(startInfo);

我的假设是正确的吗?即只有在上面的操作完成后,最后一行才会执行?所以我可以百分之百确定数据已经全部在xml中,然后再尝试启动它,对吗?

现在我遇到错误的第二部分在这里:

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

现在的情况是,在第三方程序读入文件之前,该文件已被删除。有没有一种方法可以检查文件是否不再使用,或者制定一种稳定的等待方式?
我已经找到了使用Thread.Sleep(TimeInMiliSec);的方法,但我想这不是正确的做法(更像是一种解决方法)?
4个回答

10

描述

您可以使用我的示例中的方法并进行while循环。

示例

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

这将等待文件被删除的时间。 - dknaack
使用此代码时,请小心捕获IOException。如果文件不存在,则可能会陷入循环,因为FileNotFoundException扩展了IOException。 - gregwhitaker
@Dante1986 - 是的,XmlDocument.Save是同步调用。它会在返回并执行您的Process.Start之前保存文件。 - gregwhitaker
@Dante1986 只有在文件未被锁定时,while 循环后的最后一行才会执行。 - dknaack
这个人是一个天才。他的代码完美运行。 - WyattH7
显示剩余3条评论

4
似乎你只需要添加以下类似内容:
Process p = new Process();
p.StartInfo = startInfo;
p.WaitForExit();

Process.Start()启动另一个进程,但在继续执行之前不等待该进程完成。


如果第三方程序崩溃了,那么它也算作退出吗?因为我无法确切知道用户在第三方程序中做了什么,或者他是如何退出的。 - Dante1986
如果其他进程崩溃,WaitForExit将返回。 如果有其他程序正在操作该文件,则必须使用其他答案之一,但是如果只是自己被绊倒,那么应该像这样做。 - Servy

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

2

这是一个常见的问题。解决方法不幸的是尝试打开它并查看是否有异常。

使用此处的 IsFileLocked(...) 方法:

有没有一种方法可以检查文件是否正在使用?

然后执行以下操作:

while ( IsFileLocked(new FileInfo(FilePath)) ) 
{ 
    Thread.Sleep(TimeInMiliSec); 
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接