我的申请中有这个问题:
我的第一个问题是关于代码的这一部分:
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);
的方法,但我想这不是一种正确的方法(更像是一种解决方案)?
答案 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
}
也许你会创建一个计时器并每隔几秒检查一次?
希望它有所帮助,我的第一篇文章: - )