C# 检查文件是否正在使用,等待其完成
我的申请中存在以下问题:C# 检查文件是否正在使用,等待其完成,c#,file,load,delete-file,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"); //
- 步骤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)的方法代码>但我想这不是一种正确的方法(更像是一种变通解决方案)?说明
您可以在我的示例中使用该方法并执行while循环
样品
这是一个常见的问题。不幸的是,解决方案是尝试打开它,看看是否有异常
从以下位置使用IsFileLocked(…):
然后做一些类似的事情:
while ( IsFileLocked(new FileInfo(FilePath)) )
{
Thread.Sleep(TimeInMiliSec);
}
看起来您只需要添加以下内容:
Process p = new Process();
p.StartInfo = startInfo;
p.WaitForExit();
Process.Start()启动另一个进程,但它不会等待该进程完成后再继续。如果第三方程序崩溃,它是否也会被视为退出?因为我真的不知道用户在第三方程序中做了什么,或者他是如何退出的there@Dante1986如果另一个进程崩溃,WaitForExit将返回,是的。如果有其他程序触及该文件,则您将被迫使用其他答案中的一个,但如果您只是被自己绊倒,则您应该这样做。这是单独解决主题,不是因为发布的代码正在从两个进程访问同一个文件,而不是等待进程结束。这将等待文件被删除的时间。必须小心用此代码捕获IOException。如果文件不存在,由于FileNotFoundException扩展了IOException,您可能会陷入循环。我的假设是否正确,即最后一行仅在上述操作完成后才执行?因此,只有保存完成后才会启动?@Dante1986-是的,XmlDocument.save是一个同步调用。它将在返回并执行Process.Start之前保存文件。
Process process = Process.Start(startInfo);
process.WaitForExit(); // alteratively, you can use WaitForExit(int milliseconds)
File.Delete("Filename");
Process process = Process.Start(startInfo);
process.WaitForExit(); // alteratively, you can use WaitForExit(int milliseconds)
File.Delete("Filename");