Как определить, используется ли файл или каталог или нет? - PullRequest
2 голосов
/ 06 мая 2019

Я работаю над сценарием, который следит за папкой downloads на предмет выполненных элементов, и, когда он найден, начинает обработку этого элемента.

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

Хотя этот метод может быть точным, когда файл / каталог действительно используется или нет, он может не работать с некоторыми браузерами или загрузчиками, которые не блокируют файлы во время ожидания возобновления. Версия, которая также проверяет дату и обрабатывает только, если xx дней не будет идеальным, так как все загрузки будут задерживаться.

У кого-нибудь есть идея получше?

1 Ответ

1 голос
/ 06 мая 2019

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

$file = "\\xxxx\xxxxx\xxxxxxxx\test.log"
try { [IO.File]::OpenWrite($file).close();exit 0 } catch { exit 999}

Я не заметил, что браузеры оставляют файл разблокированным, но у меня естьвидел их выбрать альтернативное имя (* .part или * .partial), пока загрузка не будет завершена.Возможно, стоит использовать логику, которая проверяет расширение файла до тех пор, пока .part :

Push-Location 
do{
  Sleep 1
}while((Get-ChildItem (join-path $env:USERPROFILE 'Downloads\*.part*')).Length -gt 0) 
...