【问题标题】:How can I check if a directory can be renamed in VB.NET?如何检查一个目录是否可以在 VB.NET 中重命名?
【发布时间】:2009-06-29 16:17:10
【问题描述】:

我的想法是使用 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 拒绝重命名时,它并没有递归。

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

编辑:

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

【问题讨论】:

    标签: .net vb.net winapi pinvoke createfile


    【解决方案1】:

    是的,我知道我可以试着抓住 例外。但是在那个点 我想知道目录是否可以 重命名和我想要的点 重命名目录不是 一样。

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

    【讨论】:

    • 如果您知道以前所有重命名失败的单一原因,并且知道用户只要发出警告就可以阻止它们。
    • 如何防止操作系统在不自己锁定文件的情况下锁定文件?
    • 你不能。但是,如果您知道是什么导致了过去发生的每个实例,并且知道警告会阻止这种情况发生,那么您可以合理地确定它不会发生。
    【解决方案2】:

    未经测试,但这应该可以:

    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
    

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

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

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

    【讨论】:

    • 据我所知,对于所有有效路径,包括不存在的路径、C: 根目录和无法重命名的目录,这都会返回 true(不会引发异常)。
    • 已更正,我希望...我认为上面的“或”必须导致 OR 搜索而不是 AND 搜索,这是我的意图。
    • 对于前面提到的所有路径仍然返回 true。只是为了好玩,我用 .AllAccess 尝试过,它仍然有相同的行为。
    • 这是一个非常常见的误解 - FileIOPermissionAccess 仅测试代码访问安全性(程序集是否有足够的信任来访问该文件路径)而不是文件系统安全性(当前用户是否有权访问该文件或文件夹。
    • 将文件重命名为自身已被清楚地记录为导致 IOException。我正在努力保持耐心,但请在提出其他建议之前至少做一些研究。
    猜你喜欢
    • 2020-02-09
    • 1970-01-01
    • 2011-04-18
    • 1970-01-01
    • 2014-12-19
    • 1970-01-01
    • 1970-01-01
    • 2017-12-30
    • 1970-01-01
    相关资源
    最近更新 更多