【问题标题】:GetFileSecurityW always returns File not foundGetFileSecurityW 总是返回 File not found
【发布时间】:2012-04-09 15:44:41
【问题描述】:

从 VBA 调用 GetFileSecurityW 总是返回“找不到文件”,即使可以使用 CreateFileW 获取文件句柄。下面的例子

  sUnicode = MakeUnicode(szfilename)
    Debug.Print sUnicode
    bSuccess = GetFileSecurityW(StrPtr(MakeUnicode(szfilename)), OWNER_SECURITY_INFORMATION, 0, 0&, _
                                sizeSD)
    Debug.Print ErrorMsg(Err.LastDllError)


    Const GENERIC_READ As Long = &H80000000
    Const OPEN_EXISTING = &H3
    Const FILE_SHARE_READ = &H1
    Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20
    Const FILE_ATTRIBUTE_HIDDEN As Long = &H2
    Const FILE_ATTRIBUTE_READONLY As Long = &H1
    Const FILE_ATTRIBUTE_SYSTEM As Long = &H4
    Const FILE_ATTRIBUTE_NORMAL = &H80&

    Dim Flags As Long, Access As Long
    Dim Disposition As Long, Share As Long

    Access = GENERIC_READ
    Share = FILE_SHARE_READ
    Disposition = OPEN_EXISTING
    Flags = FILE_ATTRIBUTE_ARCHIVE Or FILE_ATTRIBUTE_HIDDEN Or FILE_ATTRIBUTE_NORMAL _
            Or FILE_ATTRIBUTE_READONLY Or FILE_ATTRIBUTE_SYSTEM

    Debug.Print CreateFileW(StrPtr(sUnicode), Access, Share, ByVal 0&, Disposition, Flags, 0&)

UNC 文件路径的调试输出是

\\?\UNC\kazw029530\Test Long File Folder Name\DAFF004 - ICON\201104 DAFF004 ICON SR3    LOMP3P WBS FGOV-5100035-01-10 110506 LOMP003P RiskAnalysis vA1 4.xls
The system cannot find the file specified.

4448

【问题讨论】:

    标签: winapi unicode filesystems ownership


    【解决方案1】:

    很遗憾,并非所有 Windows API 函数都支持 \\?\ 前缀。 CreateFileW 有,GetFileSecurityW 没有。文档指定函数是否支持它。

    因此,您必须使用不带此前缀的文件名,这将其长度限制为MAX_PATH 个字符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-19
      • 2012-08-16
      • 2015-06-09
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-12-18
      • 1970-01-01
      相关资源
      最近更新 更多