Определите, можно ли переместить каталог в NTFS - PullRequest
1 голос
/ 18 июля 2010

У меня есть каталог, который содержит множество файлов в сложном дереве подкаталогов.

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

Если это так, как я могу программно определить, можно ли переместить каталог A в B?

Есть ли какой-либо связанный с блокировкой API, который может помочь мне в этом?

Я использую C # на разделах NTFS.

Ответы [ 2 ]

4 голосов
/ 18 июля 2010

Такого рода API "мог бы это работать" не существует в многозадачной операционной системе.Они по своей сути ненадежны, как проверка, если файл заблокирован.Такой тест может вернуть «не заблокирован», тогда ваш поток может быть прерван, а другой поток в другом процессе может заблокировать файл.Когда ваш поток восстанавливает ЦП, вы обнаружите, что файл заблокирован, хотя тест показал, что это не так.

Единственный способ сделать это - выполнить операцию, а затем найтиошибка, указывающая, что это невозможно.Исключение в C #, используйте оператор try , чтобы перехватить IOException.Не так легко справиться, но, по крайней мере, NTFS позволяет переименовывать или перемещать заблокированный файл.

2 голосов
/ 18 июля 2010

Существует так много вещей, которые могут привести к сбою операции перемещения:

  • Файл в каталоге заблокирован
  • У вас нет разрешения на запись в B
  • У вас нет разрешения на запись в A (копирование работает, но не перемещается)
  • У вас есть разрешение на запись в A, но не на каждый файл внутри
  • повреждение данных (поврежденный жесткий диск)
  • Кто-то уже переместил эту папку

И, возможно, о многих других вещах, о которых вы даже не подумаете, пока это не произойдет в производстве.

В любом случае NTFS поддерживает транзакции начиная с Vista / 2008так что вы могли бы обернуть свою задачу в TransactionScope:

Вот статья об этом: http://msdn.microsoft.com/en-us/magazine/cc163388.aspx

И отличный учебник здесь: community.bartdesmet.net

...