Самый безопасный способ скопировать файл - PullRequest
0 голосов
/ 31 марта 2010

Мне нужно объединить два файла PDF. Однако иногда файл может быть заблокирован

Я написал этот код, но мне интересно, если это не самое умное решение:

     private static int FILE_LOCKED_WAIT_PERIOD = 1000;
while (true)
                    {
                        // If the file is in use, IOException will be thrown.
                        // If file is not permitted to be opened because of Permission 
                        // Restrictions, UnauthorizedAccessException will be thrown.
                        // For all other, Use normal Exception.

                        try
                        {
                            inputDocument1 = PdfReader.Open(fileToMerge, PdfDocumentOpenMode.Import);

                            break;
                        }
                        catch (IOException)
                        {
                            Thread.Sleep(FILE_LOCKED_WAIT_PERIOD);
                        }
                        catch (UnauthorizedAccessException)
                        {
                            Thread.Sleep(FILE_LOCKED_WAIT_PERIOD);
                        }
                        catch (Exception)
                        {
                            Thread.Sleep(FILE_LOCKED_WAIT_PERIOD);
                        }
                    }

Ответы [ 3 ]

0 голосов
/ 31 марта 2010

Ну, это зависит от: 1) Является ли этот процесс внутренним для системы, независимой от пользователя? Если это так, вы должны попытаться выяснить, что блокирует файл, и ждать явно. Случайное ожидание, а затем повторная попытка может вызвать проблемы самостоятельно.

2) Может ли пользователь открыть файл? В этом случае ожидание не помогает, так как система может повторить все выходные, потому что пользователь внезапно ушел на день. Вы не можете контролировать время пользователя. Просто скажите пользователю, что вы не можете выполнить запрошенную операцию, поскольку файл открыт, и попросите его повторить попытку.

Обычно ожидание N секунд / минут на самом деле не является решением. Либо вы знаете, в чем может быть проблема, и опрашиваете и решаете проблему, либо не можете ничего сделать, просто отправив уведомление.

0 голосов
/ 31 марта 2010

Специальной функции для этого нет. На самом деле, даже если эта функция существует, некоторый процесс все еще может легко заблокировать этот файл между «проверкой блокировки» и «открытием файла»

0 голосов
/ 31 марта 2010

Вы должны добавить таймер, чтобы вы проспали несколько кликов, прежде чем снова попытаться выполнить операцию с файлом.

Также у вас должен быть счетчик, чтобы вы не ждали бесконечно и выходили после 15 попыток.

...