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

Windows 磁碟管理與檔案基本操作:容量查詢、刪除複製移動

     編輯:關於C語言

前言

本文涵蓋磁碟機類型判斷、分區容量查詢(GetDiskFreeSpace/Ex)、檔案刪除/複製/移動/重命名四大核心操作,並提供可直接編譯的命令列工具範例。

一、判斷光碟機是否有媒體

UINT type = GetDriveType("D:\\");
if (type != DRIVE_CDROM) { /* 非光碟機 */ }

CHAR fsName[512];
DWORD flags;
if (!GetVolumeInformation("D:\\", NULL, 0, NULL, NULL, &flags, fsName, 512)) {
    if (GetLastError() == ERROR_NOT_READY)  // 21
        printf("請放入光碟\n");
}
else printf("檔案系統: %s\n", fsName);

二、磁碟空間資訊查詢

GetDiskFreeSpace(傳統,以叢集為單位)

DWORD sectPerClust, bytesPerSect, freeClust, totalClust;
GetDiskFreeSpace("D:\\", &sectPerClust, &bytesPerSect, &freeClust, &totalClust);
ULONGLONG freeBytes = (ULONGLONG)freeClust * sectPerClust * bytesPerSect;
ULONGLONG totalBytes = (ULONGLONG)totalClust * sectPerClust * bytesPerSect;

GetDiskFreeSpaceEx(現代,直接以位元組為單位,支援 >4GB)

ULARGE_INTEGER freeAvail, totalBytes, freeBytes;
GetDiskFreeSpaceEx("D:\\", &freeAvail, &totalBytes, &freeBytes);
// 直接使用 .QuadPart 取得 64 位整數
printf("可用: %llu  總容量: %llu  剩餘: %llu\n",
    freeAvail.QuadPart, totalBytes.QuadPart, freeBytes.QuadPart);

ULARGE_INTEGER 結構

typedef union _ULARGE_INTEGER {
    struct { DWORD LowPart, HighPart; } u;
    ULONGLONG QuadPart;
} ULARGE_INTEGER;

三、檔案基本操作 API

函式原型說明
DeleteFileBOOL DeleteFile(LPCTSTR lpFileName);刪除檔案,目錄需用 RemoveDirectory
CopyFileBOOL CopyFile(LPCTSTR src, LPCTSTR dst, BOOL failIfExists);failIfExists=TRUE 目標存在時失敗
MoveFileBOOL MoveFile(LPCTSTR src, LPCTSTR dst);移動/重命名,跨磁碟機需 MoveFileEx + MOVEFILE_COPY_ALLOWED

四、整合命令列工具範例

int main(int argc, char* argv[]) {
    if (argc < 3) { puts("Usage: tool -d|-c|-m src [dst]"); return 1; }

    if (!strcmp(argv[1], "-d") && argc == 3) {           // 刪除
        if (DeleteFile(argv[2])) puts("刪除成功");
        else printf("失敗: 0x%X\n", GetLastError());
    }
    else if (!strcmp(argv[1], "-c") && argc == 4) {      // 複製
        if (CopyFile(argv[2], argv[3], TRUE)) puts("複製成功");
        else if (GetLastError() == ERROR_FILE_EXISTS) {   // 0x50
            printf("檔案存在,覆蓋? y/n: ");
            if (getchar() == 'y' && CopyFile(argv[2], argv[3], FALSE))
                puts("覆蓋成功");
        }
        else printf("失敗: %d\n", GetLastError());
    }
    else if (!strcmp(argv[1], "-m") && argc == 4) {      // 移動/重命名
        if (MoveFile(argv[2], argv[3])) puts("移動成功");
        else printf("失敗: %d\n", GetLastError());
    }
    else puts("參數錯誤");
    return 0;
}

五、注意事項

  • CopyFile/MoveFile 不支援目錄,需自行遞迴
  • 跨磁碟機移動必須用 MoveFileEx 並允許複製
  • 大檔案操作建議加 FILE_FLAG_SEQUENTIAL_SCAN 或使用 CopyFileEx 進度回呼
  • C++17 專案請改用 std::filesystem::copy/rename/remove
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved