如何等待另一个外部进程释放文件?

时间:2014-03-10 00:47:21

标签: c# process

我使用PDFCreatorProcess start()命令行创建文件。我等待一段时间使用WaitForExit()其他我Kill进程并再次使用WaitForExit()

执行这些步骤后,有时会创建输出文件,有时则不会。所以我检查File.Exist()是否访问输出文件。

我面临的问题是,即使创建文件的过程被杀死或返回,有时这个文件也被另一个Process使用(可能是PDFCreator创建的其他一些进程或者Spooler我不确定)

因此我Wait()3pollx次尝试,然后因故障而抛出异常。

我需要移动创建的文件,我需要检查文件是否存在,然后等到使用它的其他进程释放它或(可能找到哪个进程正在使用它并杀死它?)。如果文件没有退出,我可以继续处理失败案例。

如何去做?

我可能会尝试移动,然后如果另一个进程的例外正在使用它,那么我可以pollwait

但任何干净的方法?我不确定为什么即使在Process被杀死或返回后文件仍在使用中。

1 个答案:

答案 0 :(得分:0)

您的根本问题可能是您在创建过程中使用“kill”之前完成其任务。理想情况下,您应该在继续之前等待完成,否则您将遇到像现在这样的锁定。

这就是为了检查文件是否正在使用并且可以移动,您可以尝试使用从here获取的代码:

protected virtual bool IsFileLocked(FileInfo file)
{
    FileStream stream = null;

    try
    {
        stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None);
    }
    catch (IOException)
    {
        //the file is unavailable because it is:
        //still being written to
        //or being processed by another thread
        //or does not exist (has already been processed)
        return true;
    }
    finally
    {
        if (stream != null)
            stream.Close();
    }

    //file is not locked
    return false;
}