1

我的一个程序需要帮助,该程序可以提取系统上的可用驱动器并打印有关驱动器的各种信息。我正在使用 VC++,对 C++ 还很陌生,需要一些高级输入或经验丰富的程序员的示例代码。

这是我当前的源代码:

#include "stdafx.h"
#include Windows.h 
#include stdio.h 
#include iostream 

using namespace std; 

int main()
{
    // Initial Dummy drive
    WCHAR myDrives[] = L" A";  

    // Get the logical drive bitmask (1st drive at bit position 0, 2nd drive at bit position 1... so on)  
    DWORD myDrivesBitMask = GetLogicalDrives();  

    // Verifying the returned drive mask  
    if(myDrivesBitMask == 0)   
        wprintf(L"GetLogicalDrives() failed with error code: %d\n", GetLastError());  
    else  { 
        wprintf(L"This machine has the following logical drives:\n");   
        while(myDrivesBitMask)     {      
            // Use the bitwise AND with 1 to identify 
            // whether there is a drive present or not. 
            if(myDrivesBitMask & 1)    {     
                // Printing out the available drives     
                wprintf(L"drive %s\n", myDrives);    
            }    
            // increment counter for the next available drive.   
            myDrives[1]++;    
            // shift the bitmask binary right    
            myDrivesBitMask >>= 1;   
        }   
        wprintf(L"\n");  
    }  
    system("pause");   
}

` - 这是输出 -

This machine has the following logical drives:
drive  C
drive  D
drive  E
drive  F
drive  G
drive  H
drive  I

我需要输出关于每个驱动器的附加信息(也许一个例子会在更短的时间内讲述这个故事):

驱动器 - C:\ 驱动器类型:固定驱动器就绪状态:真实卷标:引导驱动器文件系统类型:NTFS 可用空间:30021926912 总驱动器大小:240055742464

驱动器 – D:\ 驱动器类型:固定驱动器就绪状态:真实卷标:应用程序数据文件系统类型:NTFS 可用空间:42462507008 总驱动器大小:240054693888

我可以使用哪些方法、libs api 等来提取驱动器类型、驱动器状态、卷标、文件系统类型、可用空间和驱动器总大小?

*旁注,我注意到我的预处理器指令存在缺陷,特别是在标准 I/O 头文件中。我知道这不是使用 printf 的推荐方式,并且 cout 是类型安全的,并且是正确的路径,但我无法弄清楚如何在 cout 中格式化输出,就像你在wprintf(L"drive %s\n", myDrives);.... so how would you do this with cout??

提前致谢。

4

2 回答 2

2

您想查看GetVolumeInformation等函数来检索可用空间和卷名等文件系统信息。

GetDriveType将为您提供有关驱动器类型的一些基本信息,但 USB 拇指棒和闪存阅读器可以提供令人惊讶的结果。

我不确定您所说的“就绪状态”是什么意思。如果您的意思是驱动器中是否有有效的卷,那么您可以尝试CreateFile使用“\\.\C:”的路径来尝试打开该卷。如果失败,则不存在卷(磁盘)。这将用于 SD 卡读卡器。要在不出现错误对话框的情况下执行此操作,您需要先调用SetErrorMode(SEM_NOOPENFILEERRORBOX)

于 2013-01-07T14:32:43.167 回答
0

要检查驱动器是否准备好,您还可以使用GetDiskFreeSpaceEx。如果此操作失败,则驱动器未准备好/不可用。

这是一些示例代码: http: //pinvoke.net/default.aspx/coredll/GetDiskFreeSpaceEx.html

于 2013-01-07T16:02:02.753 回答