0

我的想法是使用 kernel32 中的 CreateFile 并检查共享违规。我相信这会起作用,因为我在从 CMD 发出重命名命令时使用 Process Monitor 观察了文件系统活动,我知道该命令会失败,最后一个活动是 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 代码,我产生了一个调用,它在进程监视器中提供了相同的信息,但没有导致共享冲突。

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)

这些常量是从各种MSDNpinvoke.net源中提取的。

如果我在所有子文件夹上递归调用上述代码,最终会导致共享冲突,但是当 CMD 拒绝重命名时,它并没有递归。

是的,我知道我可以尝试捕获异常。但是我想知道目录是否可以重命名的点和我想重命名目录的点是不一样的。

编辑:

这个问题可能存在混淆的根源。我不关心权限;我担心文件锁。

4

2 回答 2

3

是的,我知道我可以尝试捕获异常。但是我想知道目录是否可以重命名的点和我想重命名目录的点是不一样的。

在我看来,这是一个创造竞争条件的设计问题。如果您先检查然后重命名,如果您之前的检查有效,您将不知道重命名的时间。

于 2009-06-29T17:09:38.100 回答
1

未经测试,但这应该有效:

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

这将“要求”文件夹的读取和写入权限,而无需实际重命名任何内容。

编辑:上面的内容并没有像我想象的那样做,请参阅下面斯蒂芬的评论。

如果这不起作用,也许尝试用相同的文件名重命名文件会触发安全异常,而实际上不会做任何破坏性的事情(尽管它可能会“触及”目录)。

于 2009-06-29T16:25:18.830 回答