Как переместить каталог в C # .NET за одну атомарную операцию - PullRequest
4 голосов
/ 25 марта 2009

Мне нужно иметь возможность перемещать весь каталог за одну атомарную операцию, гарантируя, что ничто другое в системе не сможет подорвать операцию, создав новые файлы после запуска, заблокировав файл и т. Д.

Предположительно, я бы использовал System.IO.Directory.Move (), если каталоги были на одном и том же томе (если Directory.GetDirectoryRoot () одинаков), в противном случае мне пришлось бы создать новый целевой каталог другой том и рекурсивно скопируйте / переместите все каталоги и файлы внизу.

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

Ответы [ 3 ]

3 голосов
/ 26 марта 2009

Vista поддерживает транзакции в томах NTFS:

http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

1 голос
/ 26 марта 2009

Не могли бы вы обойти эту проблему, временно переименовав «корневой» каталог (создав каталог с тем же именем сразу после этого, чтобы у любого, кто обращается к этому каталогу, не возникла ошибка), а затем поработать с файлами в переименованном каталоге?

0 голосов
/ 25 марта 2009

Я бы сказал, что вам действительно нужна транзакционная файловая система ... которой нет NTFS, и хотя у MS были планы на такое, она была вырезана из Longhorn до того, как стала Vista (и из Каира до ).

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

Что вы действительно пытаетесь сделать? Почему вы беспокоитесь о параллельной деятельности?

...