2015-01-14 1 views
0

Сценарий: у меня есть файл в системе, который будет заменить в любое время, и мне нужно записать каждое изменение, которое они делают.Как обновить файлы с уровнем изоляции, подобным СУБД?

Решение: Я использую IO.FileSystemWatcher для записи изменений, как только пользователи загружают новый файл, он будет переименовывать старый файл с отметкой времени и именем пользователя домена, чтобы сделать его уникальным.

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

Моя идея: с помощью СУБД контроля на основе блокировки транзакции могут выполняться с фиксацией. Что делать, если я могу сделать то же самое в файловой системе? Можем ли мы заблокировать файл при запуске программы и выпустить его после «commit»? Если может, как я могу это сделать?

Я его реализации с помощью PowerShell, на основе .NET Framework:

Register-ObjectEvent $FileWatcher "Changed" -Action { 
Add-content "C:\Projects\user_watching\log.txt" -value $(Get-Date -format yyyyMMddHHmmss) 
Copy-Item "C:\Projects\user_watching\UserProfile.xml" "C:\Projects\housekeep\"$DomainUser"UserProfile"$(Get-Date -format yyyyMMddHHmmss)".xml" 
} 

ссылки ссылку о FileSystemWatcher Класс:

http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher%28v=vs.110%29.aspx

+1

NTFS и FAT не предназначены для транзакционных операций, хотя Longhorn совершил неудачную попытку в течение этих десяти лет назад. Поэтому попытка реализовать ACID поверх чего-то, что очень определенно не является ACID-совместимой, почти наверняка будет крайне нетривиальной. –

+0

Я только что нашел этот соответствующий командлет, я могу использовать Copy-Item в качестве части моего трансакции, но я не могу работать на замену, потому что это не часть моей программы. http://technet.microsoft.com/en-us/library/hh847861.aspx – Alan

ответ

0

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

Вот ссылка, чтобы вы начали: Обеспечение того, чтобы два PowerShell скрипты не работают одновременно http://www.lukepuplett.com/2013/01/ensuring-that-two-powershell-scripts.html?m=1