【问题标题】:Windows file and path names for local drive with CreateFile() WinAPI使用 CreateFile() WinAPI 的本地驱动器的 Windows 文件和路径名
【发布时间】:2019-01-23 21:06:27
【问题描述】:

在 Windows XP 和 Windows 7 上运行良好的应用程序突然在 Windows 10 Pro 中出现问题。但是,对于 Windows 10 IoT Enterprise,它似乎运行良好。早在 2018 年 5 月,它似乎在 Windows 10 上也可以正常工作,但在 Windows 10 的较新安装中,它不起作用。

经过一些调查,我们发现该应用程序似乎无法通过 Windows 10 专业版创建用于持久数据的文件集。

进一步看,我们发现完整的路径名不正确。似乎存储文件的目录的路径名虽然构造不正确,但在 Windows XP 和 Windows 7 上运行良好,但在 Windows 10 Pro 上却不行。

生成的路径名看起来像这样(那些是路径反斜杠,而不是用于转义字符的 C/C++ 反斜杠):

\C:\DirA\DirB\DirC

生成的正确路径名如下所示:

\\.\C:\DirA\DirB\DirC

阅读 MSDN 在Naming Files, Paths, and Namespaces 上的文章后,我对构造有效路径名的多种不同方法感到有些困惑。不同的 Windows 文件系统(FAT16、FAT32、NTFS 等)似乎有不同的命名约定。

我应该使用什么路径名格式,以便我的应用程序能够使用多个不同版本的 Windows 在本地驱动器 C: 上的特定目录中创建和打开文件?我对 Windows 7、POSReady 7、Windows 10 和 Windows 10 IoT Enterprise(与 Windows 10 IoT 不同)特别感兴趣。

我正在使用 Win32 API CreateFile() 函数来创建/打开文件。

【问题讨论】:

  • 似乎不同的 Windows 文件系统(FAT16、FAT32、NTFS 等)具有不同的命名约定 - 不,这是错误的。这里的文件系统根本不相关。 win32 sunsystem 在传递到文件系统之前转换您的路径本机格式。 The Definitive Guide on Win32 to NT Path Conversion
  • @RbMm 感谢您提供指向指南文档的链接。

标签: file winapi path


【解决方案1】:

我应该使用什么路径名格式,以便我的应用程序能够使用多个不同版本的 Windows 在本地驱动器 C: 上的特定目录中创建和打开文件?

你应该使用:

C:\DirA\DirB\DirC

或者,如果您需要 access a pathname longer than MAX_PATH,并且不/不能选择加入 Windows 10 版本 1607 中引入的新 longPathAware 功能:

\\?\C:\DirA\DirB\DirC

不要使用\C:\DirA\DirB\DirC,它的格式不正确。

您不需要使用\\.\C:\DirA\DirB\DirC,尽管它工作。就be aware那个:

"\\.\" 前缀将访问 Win32 设备命名空间,而不是 Win32 文件命名空间。

通常,您只会在访问本地设备时使用\\.\,例如物理卷、串行/并行端口、命名管道、邮槽等。而不是在访问文件系统上的条目时。

【讨论】:

  • 使用 UNC 路径访问网络共享,即:\\server\share\\?\UNC\server\share
  • 但为什么不\\.\C:\DirA\DirB\DirC - 这是正式的正确形式
  • 是的,但是我,如果说是真的,我不明白将访问 Win32 设备命名空间而不是 Win32 文件命名空间的含义,该文件始终在设备上打开。文件系统文件也是。对我来说不清楚
  • 当然说 shell api 不会转换带有 \\.\ 或 \\?\ 前缀的路径,但是对于 CreateFile 文件系统设备 - 这也是设备。 \\.\PhysicalDiskX\\.\c: 都是指向某些设备的符号链接 - 事实上这里没有任何不同,因为我不理解 msdn 文章
  • @RbMm 你显然是一个低级胆量的人,你总是发布 cmets/answers 挖掘 API 内部等。所以也许你喜欢在你的 API 调用中拥有更多的权力。典型用户不会。在访问文件系统以执行简单任务(创建/读取/写入文件等)时,使用\\.\ 是多余的,但它显然在更高级的场景中有它的用途。这不是其中之一。
猜你喜欢
  • 1970-01-01
  • 2013-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-04
相关资源
最近更新 更多