Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查文件是否正在使用,等待其完成_C#_File_Load_Delete File - Fatal编程技术网

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");