3

我在 OS X 10.8 主机上的 VirtualBox 中运行 Windows 7。主机有一个共享文件夹,里面有一个名为的文件>>>FILE<<<。显然,OS X 本身对这样的文件名没有问题。<不幸的是,由于名称中的s 和s ,我似乎无法在 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 中是否有一种已知方法可以访问名称中包含无效字符的文件?假设一个生产环境没有对主机文件系统的直接写访问权限。

4

2 回答 2

2

@jcophenha 的答案是正确的。但是,如果您阅读@jcopenha 链接到的页面,它会声明\\?\前缀仅用于本地路径。您必须\\?\UNC\对 UNC 路径使用前缀,例如:

L"\\\\?\\UNC\\VBOXSVR\\ft1\\>>>FILE<<<"
于 2013-01-07T22:07:16.743 回答
1

Windows 文件名中不允许使用and<字符。>所以这个文件不能在Win32下打开。

命名约定文档列出了以下保留字符:

  • <(小于)
  • >(大于)
  • : (冒号)
  • "(双引号)
  • /(正斜杠)
  • \(反斜杠)
  • | (垂直条或管)
  • ? (问号)
  • *(星号)

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

现在,可以想象这些限制在使用本机 API 时不适用。您可以尝试使用NtCreateFile. 这可能只是工作!

于 2013-01-07T23:17:09.047 回答