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

时间:2012-01-25 21:48:23

标签: c# file load delete-file

我的申请中有这个问题:

  • 步骤1 - 创建一个文件(xml)并在其中放入一些内容
  • 第2步 - 第三方应用程序将打开该文件并从步骤1中生成的文件中获取信息。
  • 第3步 - 再次删除文件。

我的第一个问题是关于代码的这一部分:

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

我的假设是否正确,只有在完成上述操作后才会执行最后一行? 所以我可以100%确定数据是否都在xml中,然后再尝试启动它?

我现在收到错误的第二部分是:

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

现在发生的事情是,在第三方程序将文件读​​入内存之前,该文件已被删除。

有什么方法可以检查文件是否已被使用,或者采取一些稳定的等待方式?

我已经找到了使用Thread.Sleep(TimeInMiliSec);的方法,但我想这不是一种正确的方法(更像是一种解决方案)?

5 个答案:

答案 0 :(得分:9)

描述

您可以在我的示例中使用该方法并执行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;
}

答案 1 :(得分:3)

看起来你只需要添加如下内容:

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

Process.Start()启动另一个进程,但它不会等到该进程完成后再继续。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

这是一个常见问题。解决方案是不幸的,试着打开它,看看是否有异常。

从这里使用IsFileLocked(...):

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

做类似的事情:

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

答案 4 :(得分:0)

您可以检查进程是否仍在运行...

        if (System.Diagnostics.Process.GetProcessesByName("notepad").Length < 1)
        {
            Console.WriteLine("The process isnt running"); 
        }
        else
        {
            Console.WriteLine("The process is running..."); //Your code to delete the file
        }

也许你会创建一个计时器并每隔几秒检查一次?

希望它有所帮助,我的第一篇文章: - )