WinApi.应用程序提供了错误的磁盘信息



我编写了一个应用程序,它为我提供了有关磁盘的信息。但有一个例外。我把我的应用程序放在桌面C:上。应用程序提供了关于pendrive和磁盘E:的正确信息,但不适用于磁盘C:。当我在pendrive上复制我的应用程序并运行它(从pendrive)时,我得到了关于磁盘C:和E:的正确信息,但不适用于PENDRIVE。

问题出现在函数GetVolumeInformation中。这个函数给了我错误的信息(只适用于我运行应用程序的磁盘)

GetVolumeInformation( ListItem, volumeNameBuffer, MAX_PATH, & volumeSerialNumber, & maximumComponentLength, & fileSystemFlags, fileSystemNameBuffer, MAX_PATH );

总之:我有关于所有磁盘的正确信息(磁盘类型、大小)和GetVolumeInformation函数中有关参数的错误信息,但仅适用于我运行应用程序的磁盘。错误的信息右侧信息

如果我将ListItem var设置为保持"C:",则代码成功。如果我将这个var设置为保持"D:",它将失败,FormatMessageGetLastError报告:The filename, directory name, or volume label syntax is incorrect.

如果我将var设置为保持"D:/"或"D:\\",那么它就成功了。我的系统中存在的所有逻辑驱动器号也是如此。

仔细查看GetVolumeInformation的文档,我们可以看到它期望的第一个参数是一个字符串,该字符串包含要描述的卷的根目录。因此,如果您只传递C:或D:etc,那么您传递的是相关驱动器的当前目录,该目录可能是根目录,也可能不是根目录。如果不是根,*轰!

此外,附带说明-卷序列号是一个32位数字,通常以十六进制表示。以下代码段以与dir命令相同的方式对其进行格式化。

printf("Vol ser#: '%X-%X'n", (volumeSerialNumber>>16) , (volumeSerialNumber&0xFFFF) );

结果Vol ser#: 'AA25-7CEF'

与以下两者相比:

printf("Vol ser#: '%X'n", volumeSerialNumber );结果:Vol-ser#:'AA257CEF')

printf("Vol ser#: '%u'n", volumeSerialNumber );结果:卷序列号:'2854583535')

最新更新