@TrK
Могу копать, могу не копать.

Как заблокировать чтение файла на время работы с ним?

Windows, скрипт на Powershell срабатывает каждые 5 минут, в скрипте Invoke-WebRequest скачивает файл с внешнего сервера и складывает его в локальный каталог - тут всё просто.
На этой же Windows некая программа регулярно читает построчно этот файл и если видит в нём новое содержимое - забирает его в свою базу.
Проблема - иногда программа читает файл в момент скачивания, в результате данные в базе появляются, но не полностью.

Как можно в таких условиях модифицировать скрипт, чтобы он блокировал чтение файла всем (кроме себя самого) во время выполнения? Модифицировать программу к сожалению не получится.
  • Вопрос задан
  • 1379 просмотров
Решения вопроса 1
@nirvimel
$file = [System.io.File]::Open('c:\files\somefile.txt', 'Open', 'Write', 'None')

Вот этот 'None' в четвертом параметре и создает эксклюзивную блокировку (как flock в *nix).
Если файл кем-то уже открыт на чтение, то [System.io.File]::Open вылетит с ошибкой.
Если блокировка будет получена, то с ошибкой будут вылетать вызовы на открытие из других программ.

Но надежнее сделать через переименование как тут уже советовали.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
vaut
@vaut
Ну точно можно скачивать в другое место и потом заменять файл.
Под линухом еще есть flock. Есть ли аналог для винды не знаю.
Ответ написан
@alexxandr
you'll see in memory only 0xDEADFACE
скриптом скачиваем файл в другое место, после копируем в нужное в флагом OF_SHARE_EXCLUSIVE
Ответ написан
Комментировать
Проблема описана не полностью или что значит "скачивать".
Читать файл могут сотни приложений не конкурируя друг с другом.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы