Как дождаться освобождения файла другим внешним процессом?

Я создаю файл, используя командную строку PDFCreator, используя Processи start(). Я жду какое-то время, используя WaitForExit(), иначе я Kill использую процесс и снова использую WaitForExit().

После этих шагов иногда создается выходной файл, а иногда нет. Поэтому я проверяю, есть ли File.Exist(), и получаю доступ к выходному файлу.

Проблема, с которой я столкнулся, заключается в том, что, хотя процесс, создающий файл, либо убит, либо возвращен, иногда этот файл используется другим Process (вероятно, каким-то другим процессом, созданным PDFCreator или Spooler, я не уверен)

Итак, я Wait() в течение 3 секунд и снова poll в течение x количества попыток, а затем выбрасываю исключение в случае сбоя.

Мне нужно переместить созданные файлы, и мне нужно проверить, что если файл существует, то подождать, пока другой процесс, использующий его, не освободит его или (возможно, найти, какой процесс его использует, и убить его?). Если файл не выходит, я могу просто продолжить работу в случае сбоя.

Как это сделать?

Я, вероятно, могу попытаться переместиться, тогда, если его использует исключение для другого процесса, я могу poll и wait.

Но какой чистый подход? Я не уверен, почему файл используется даже после того, как Process был убит или возвращен.


person Dexters    schedule 10.03.2014    source источник


Ответы (1)


Ваши основные проблемы, вероятно, связаны с тем, что вы используете «убить» в процессе создания до того, как он завершит свою задачу. В идеале вам следует дождаться завершения, прежде чем продолжить, иначе вы столкнетесь с блокировками, как сейчас.

Тем не менее, чтобы проверить, используется ли файл и доступен ли он для перемещения, вы можете попробовать использовать этот код, взятый из здесь:

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;
}
person user2801204    schedule 10.03.2014