Как я могу проверить, можно ли переименовать каталог в VB.NET? - PullRequest
0 голосов
/ 29 июня 2009

Моя мысль - использовать 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:

Возможно, в этом вопросе был источник путаницы. Меня не интересуют разрешения; Я обеспокоен блокировками файлов.

Ответы [ 2 ]

3 голосов
/ 29 июня 2009

Да, я знаю, что могу просто попытаться поймать исключение. Но точка, в которой Я хочу знать, может ли каталог переименован и точка, в которой я хочу переименовать каталог не то же самое.

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

1 голос
/ 29 июня 2009

Не проверено, но это должно работать:

Dim fp As New FileIOPermission(FileIOPermissionAccess.Write, "C:\myfolderpath")
Try
    fp.Demand()
Catch e As SecurityException
    Console.WriteLine("I can't rename this folder.")
End Try

Это «потребует» разрешения на чтение и запись для папки без фактического переименования.

Редактировать: Выше не делает то, что я думал, см. Комментарий Стивена ниже.

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

...