Обработка открытого файла при попытке File.Move () - PullRequest
2 голосов
/ 17 ноября 2008

Это лучший способ для перемещения файлов в службе Windows? у нас есть много файлов, которые сопоставляются и перемещаются, но конечный пользователь может открыть файл во время перемещения.

Это то, что код в настоящее время говорит:

Do While IO.File.Exists(OriginalFilePath)

    Try
        IO.File.Move(OriginalFilePath, BestMatchPath)
    Catch ex As IO.IOException
        Log(TraceLevel.Warning, "The file '{0}' was unable to be moved (probably opened by someone)", OriginalFilePath)
        Threading.Thread.Sleep(1000)
    End Try

Loop

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

Ответы [ 2 ]

2 голосов
/ 17 ноября 2008

Поскольку это служба Windows, и в зависимости от количества файлов, которые вы пытаетесь перемещать одновременно, я бы рассмотрел использование фонового потока для каждого перемещения файла. Если вы используете тип BackgroundWorker, вы можете перенести любое исключение обратно в основной поток, а затем подождать X минут, прежде чем пытаться переместить файл снова.

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

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

2 голосов
/ 17 ноября 2008

Предложение: в сервисном методе Start() активируйте System.Timers.Timer для периодического запуска цикла перемещения файлов без вызова Sleep(1000). Таким образом, файл, который не был перемещен в текущем цикле, не будет блокировать перемещение других (разблокированных) файлов. Проблемные файлы могут быть перемещены в последующих испытаниях. Настройте интервал таймера в соответствии с вашими потребностями.

@ Энди подумал о многопоточности - Timer - эффективный способ справиться с многопоточностью. Сервисный процесс - это подходящее место для повторного выполнения разделов кода. Обратите внимание, что цикл без Sleep(1000) не будет блокироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...