Моя мысль - использовать CreateFile из kernel32 и проверять нарушения совместного доступа. Я полагаю, что это будет работать, потому что я наблюдал за активностью файловой системы с помощью Process Monitor, когда выдавал команду переименования из CMD, которая, как я знал, не удалась, и последним действием был неудачный вызов CreateFile, который привел к нарушению совместного использования.
Это информация о мониторе процесса вызова.
Desired Access: Read Attributes, Delete, Synchronize
Disposition: Open
Options: Synchronous IO Non-Alert, Open Reparse Point
Attributes: n/a
ShareMode: Read, Write, Delete
AllocationSize: n/a
Используя этот код VB, я произвел вызов, который дал ту же информацию в Process Monitor, но не вызвал нарушение совместного использования.
CreateFile(theDirectoryPath, _
FILE_READ_ATTRIBUTES Or DELETE Or SYNCHRONIZE, _
FILE_SHARE_READ Or FILE_SHARE_WRITE Or FILE_SHARE_DELETE, _
Nothing, _
OPEN_EXISTING, _
FILE_ATTRIBUTE_DIRECTORY Or FILE_FLAG_BACKUP_SEMANTICS _
Or FILE_FLAG_OPEN_REPARSE_POINT, _
Nothing)
Константы извлекаются из различных MSDN и pinvoke.net источников.
Если я вызову приведенный выше код рекурсивно для всех подпапок, это в конечном итоге приведет к нарушению общего доступа, но когда CMD отказался переименовать, он не рекурсивно.
Да, я знаю, что могу просто попытаться поймать исключение. Но точка, в которой я хочу знать, можно ли переименовать каталог, и точка, в которой я хочу переименовать каталог, не являются то же самое.
EDIT:
Возможно, в этом вопросе был источник путаницы. Меня не интересуют разрешения; Я обеспокоен блокировками файлов.