在Windows中访问具有无效名称的文件

时间:2013-01-07 21:41:23

标签: macos winapi filenames createfile shared-directory

我在OS X 10.8主机上的VirtualBox中运行Windows 7。主机有一个共享文件夹,里面有一个名为>>>FILE<<<的文件。显然,OS X本身对此类文件名没有任何问题。不幸的是,我似乎无法在Windows 7中打开此文件,因为名称中包含<>。 在C中,此调用失败:

CreateFileW(
    L"\\\\VBOXSVR\\ft1\\>>>FILE<<<",
    GENERIC_READ,
    FILE_SHARE_READ,
    NULL,
    OPEN_EXISTING,
    FILE_ATTRIBUTE_NORMAL,
    NULL
    );

GetLastError返回ERROR_INVALID_NAME(123)。如果我将文件名更改为FILE,我会得到一个有效的句柄,一切都很好。

Windows中是否有一种已知方法可以访问名称中包含无效字符的文件?假设一个高效的环境,没有对主机文件系统的直接写访问权。

2 个答案:

答案 0 :(得分:2)

@ jcophenha的回答是在正确的轨道上。但是,如果您阅读the page that @jcopenha linked to,则表明\\?\前缀仅适用于本地路径。您必须使用\\?\UNC\前缀代替UNC路径,例如:

L"\\\\?\\UNC\\VBOXSVR\\ft1\\>>>FILE<<<"

答案 1 :(得分:1)

不允许在Windows文件名中使用<>个字符。因此无法在Win32下打开该文件。

naming conventions文档列出了以下保留字符:

  
      
  • &LT; (小于)
  •   
  • &GT; (大于)
  •   
  • :(冒号)
  •   
  • “(双引号)
  •   
  • /(正斜线)
  •   
  • \(反斜杠)
  •   
  • | (竖杆或竖管)
  •   
  • ? (问号)
  •   
  • *(星号)
  •   

Windows在这方面与* nix系统的区别很大。在* nix上,对于可以在文件中使用的字符,通常没有这样的OS强制限制。正如我的一位朋友在他试图删除一个名为*的文件时发现的,并且遭受了最不幸的后果。

现在,可以想象使用本机API时这些限制不适用。您可以尝试使用NtCreateFile打开文件。这可能会奏效!