首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C++ Windows 文件系統核心 API 詳解:磁碟管理、卷屬性與掛載點操作

     編輯:關於C語言

一、文件系統基礎概念

在 Windows 環境下開發文件系統相關應用,首先需要理解兩個核心概念:

  • 磁碟分區:物理磁碟上的邏輯劃分區域。
  • 卷:擁有文件系統管理的存儲區域,邏輯上相互隔離的存儲單元。每個卷對應一個驅動器號(如 C:、D:)或掛載點。

二、核心 API 分類

Windows 提供三大類文件系統 API:

  1. 磁碟與驅動器管理:枚舉驅動器、獲取類型、查詢卷屬性。
  2. 文件與目錄管理:創建、刪除、複製、移動、遍歷文件/目錄。
  3. 高級文件系統操作:壓縮、加密、配額、稀疏文件、重解析點等。

三、磁碟與驅動器管理實戰

1. 遍歷所有邏輯驅動器

主要有兩種方式:

  • GetLogicalDrives / GetLogicalDriveStrings:基於驅動器號(A:~Z:)快速獲取。
  • FindFirstVolume / FindNextVolume:基於卷 GUID 路徑(\\?\Volume{GUID}\),支援無驅動器號的卷。

關鍵 API 速查表

函數用途關鍵參數/返回值
GetLogicalDrives獲取驅動器位圖返回 DWORD,每位代表一個驅動器是否存在
GetLogicalDriveStrings獲取驅動器根路徑字串需提供緩衝區,返回字串以雙 '\0' 結尾
FindFirstVolume查找第一個卷返回查找句柄,卷名存入緩衝區
FindNextVolume繼續查找下一個卷使用上一句柄,成功返回 TRUE
FindVolumeClose關閉卷查找句柄釋放資源
GetDriveType判斷驅動器類型返回 DRIVE_FIXED、DRIVE_CDROM、DRIVE_REMOVABLE 等
GetVolumeInformation獲取詳細卷屬性可獲取卷標、序列號、文件系統名稱(NTFS/FAT32)、支援特性標誌

2. 完整代碼範例:使用 GetLogicalDriveStrings 遍歷並顯示屬性

#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#define BUFSIZE 1024

BOOL GetDriverInfo(LPSTR szDrive);

int main(void) {
    CHAR szLogicalDriveStrings[BUFSIZE];
    PCHAR szDrive;
    ZeroMemory(szLogicalDriveStrings, BUFSIZE);
    GetLogicalDriveStrings(BUFSIZE - 1, szLogicalDriveStrings);
    szDrive = szLogicalDriveStrings;
    do {
        if (!GetDriverInfo(szDrive)) {
            printf("\n Get Volume Information Error: %d", GetLastError());
        }
        szDrive += (lstrlen(szDrive) + 1);
    } while (*szDrive != '\0');
    return 0;
}

BOOL GetDriverInfo(LPSTR szDrive) {
    UINT uDriveType = GetDriveType(szDrive);
    // 類型判斷 switch 省略...
    CHAR szVolumeName[MAX_PATH], szFileSystemName[BUFSIZE];
    DWORD dwSerial, dwMaxComp, dwFlags;
    if (!GetVolumeInformation(szDrive, szVolumeName, MAX_PATH, &dwSerial,
                              &dwMaxComp, &dwFlags, szFileSystemName, BUFSIZE))
        return FALSE;
    printf("\n Drive: %s\n Type: %s\n Serial: %u\n MaxComp: %u\n FS: %s",
           szDrive, szVolumeName, dwSerial, dwMaxComp, szFileSystemName);
    if (dwFlags & FILE_VOLUME_QUOTAS) printf("\n 支援磁碟配額");
    if (dwFlags & FILE_SUPPORTS_ENCRYPTION) printf("\n 支援 EFS 加密");
    return TRUE;
}

3. 使用 FindFirstVolume 系列(支援無驅動器號卷)

#define _WIN32_WINNT 0x0501
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

#define BUFSIZE MAX_PATH

BOOL GetDriverInfo(LPSTR szDrive); // 同上

int main(void) {
    TCHAR buf[BUFSIZE];
    HANDLE hVol = FindFirstVolume(buf, BUFSIZE);
    if (hVol == INVALID_HANDLE_VALUE) {
        _tprintf(TEXT("No Volumes Found!\n"));
        return -1;
    }
    GetDriverInfo(buf);
    while (FindNextVolume(hVol, buf, BUFSIZE)) {
        GetDriverInfo(buf);
    }
    FindVolumeClose(hVol);
    return 0;
}

四、卷掛載點操作

掛載點是訪問卷的另一入口,可將卷掛載到 NTFS 目錄下,不佔用驅動器號。

核心 API

  • FindFirstVolumeMountPoint / FindNextVolumeMountPoint / FindVolumeMountPointClose:枚舉指定卷的所有掛載點。
  • GetVolumeNameForVolumeMountPoint:根據掛載點路徑反查卷 GUID 名稱。

典型應用場景

  1. 突破 26 個驅動器號限制,管理大量卷。
  2. 實現目錄級備份、異地同步等高級存儲拓撲。
  3. 隱藏敏感數據卷,僅通過特定路徑訪問。

五、最佳實踐建議

  1. 優先使用 FindFirstVolume 系列,兼容性更強,支援無駐留字母的卷。
  2. 調用 GetVolumeInformation 時務必檢查返回值,並預留足夠緩衝區(建議 MAX_PATH 以上)。
  3. 操作掛載點需管理員權限,務必做錯誤碼判斷(GetLastError)。
  4. 64 位程序中注意 DWORD / HANDLE 與指針長度差異,避免截斷。

掌握這些 API,即可構建磁碟管理工具、備份軟體、系統監控代理等底層應用。下一篇將深入文件/目錄操作與高級特性(EFS、配額、稀疏文件、USN Journal 等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved