Моя идея состоит в том, чтобы использовать CreateFile из kernel32 и проверять нарушения обмена. Я считаю, что это сработает, потому что я наблюдал за активностью файловой системы с помощью Process Monitor, выдавая команду переименования из CMD, которая, как я знал, потерпит неудачу, и последним действием был неудачный вызов CreateFile, который привел к нарушению общего доступа.
Это информация Process Monitor о вызове.
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 отказался переименовывать, он не рекурсировал.
Да, я знаю, что могу просто попытаться перехватить исключение. Но точка, в которой я хочу узнать, можно ли переименовать каталог, и точка, в которой я хочу переименовать каталог, не совпадают. .
ИЗМЕНИТЬ:
Возможно, в этом вопросе была путаница. Меня не интересуют разрешения; Меня беспокоят блокировки файлов.