Я пытаюсь внедрить обновления информации в файл XML несколькими процессами, запущенными на нескольких компьютерах несколько одновременно.Я думаю, что цикл в течение 10 минут, пытаясь открыть и заблокировать файл для записи через случайные интервалы до 1 секунды.Когда файл открыт и заблокирован, я загружаю весь XML, добавляю информацию для текущего компьютера, сортирую XML, затем перепродаю и снимаю блокировку, чтобы можно было открыть следующий компьютер.Проблема в том, что Get-Content не блокирует файл, поэтому две машины могут загружать один и тот же XML, а не второй загружать XML с данными из первого.Я нашел this , который обеспечивает способ блокировки файла, затем чтения потоком, но когда я попытался изменить его на
$file = [IO.File]::Open($path, 'Open', 'ReadWrite', 'None')
$xml = Get-Content $path
, я получаю сообщение об ошибке, потому что файл заблокирован.Кажется, что Get-Content не блокирует файл, но он уважает блокировку, которая уже существует.Итак, есть ли способ заблокировать файл, чтобы только блокировка компьютера могла читать и писать?И, возможно, что еще более важно, это даже правильный подход, или есть какой-то другой подход к множественному доступу XML?Кажется, что это будет распространенный сценарий, поэтому должен быть лучший способ сделать это, даже если нет собственного подхода к командлетам.FWIW, я должен вернуться к PowerShell 2.0, который, без сомнения, ограничивает то, как я могу подойти к этому.
РЕДАКТИРОВАТЬ: Ну, это не похоже на чтение для третьего параметра в бите [io.file]работает.Теперь у меня есть
$path = '\\Px\Support\Px Tools\Resources\jobs.xml'
foreach ($i in 1..10) {
$sleepTime = get-random -minimum:2 -maximum:5
$file = [IO.File]::Open($path, 'Open', 'ReadWrite', 'Read')
[xml]$xml = Get-Content $path
$newNode = $xml.createElement('Item')
$newNode.InnerXml = "$id : $i : $sleepTime : $(Get-Date)"
$xml.DocumentElement.AppendChild($newNode) > $null
$xml.Save($path)
$file.Close()
}
, который теоретически должен взять XML, который у меня есть, с двумя фиктивными элементами журнала, прочитать его, добавить другой элемент журнала (с идентификатором, итерацией, временем ожидания и временемпечать) и повторить 10 раз, со случайным сном между.Он пытается изо всех сил пытаться сэкономить с помощью
"The process cannot access the file '\\Px\Support\Px Tools\Resources\jobs.xml' because it is being used by another process."
Я действительно пытаюсь сделать что-то, что не было сделано 1000 раз раньше?
Хорошо, основываясь на том, какие комментарии, вот гдеЯ в.Я хочу убедиться, что оригинал не может быть (легко) отредактирован вручную во время обработки.Итак, я реализовал это.1: найдите файл стража и, если он не найден 2: заблокируйте исходный файл, чтобы его нельзя было изменить 3: скопируйте оригинал в файл стража 4: измените файл стража по мере необходимости 5: разблокируйте оригинал 6: скопируйтефайл стража поверх оригинала 7: Удалить страж
Мне кажется, что сомнительный бит заключается в том, что кто-то вручную изменяет оригинал между его разблокировкой и копированием часового, что весьма маловероятно.Но, похоже, должен быть способ справиться с этим со 100% уверенностью, и я не могу придумать способ с или без файлов дозорного.