Сценарий: у меня есть файл в системе, который будет заменить в любое время, и мне нужно записать каждое изменение, которое они делают.Как обновить файлы с уровнем изоляции, подобным СУБД?
Решение: Я использую 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
NTFS и FAT не предназначены для транзакционных операций, хотя Longhorn совершил неудачную попытку в течение этих десяти лет назад. Поэтому попытка реализовать ACID поверх чего-то, что очень определенно не является ACID-совместимой, почти наверняка будет крайне нетривиальной. –
Я только что нашел этот соответствующий командлет, я могу использовать Copy-Item в качестве части моего трансакции, но я не могу работать на замену, потому что это не часть моей программы. http://technet.microsoft.com/en-us/library/hh847861.aspx – Alan