本文涵蓋磁碟機類型判斷、分區容量查詢(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);
DWORD sectPerClust, bytesPerSect, freeClust, totalClust;
GetDiskFreeSpace("D:\\", §PerClust, &bytesPerSect, &freeClust, &totalClust);
ULONGLONG freeBytes = (ULONGLONG)freeClust * sectPerClust * bytesPerSect;
ULONGLONG totalBytes = (ULONGLONG)totalClust * sectPerClust * bytesPerSect;
ULARGE_INTEGER freeAvail, totalBytes, freeBytes;
GetDiskFreeSpaceEx("D:\\", &freeAvail, &totalBytes, &freeBytes);
// 直接使用 .QuadPart 取得 64 位整數
printf("可用: %llu 總容量: %llu 剩餘: %llu\n",
freeAvail.QuadPart, totalBytes.QuadPart, freeBytes.QuadPart);
typedef union _ULARGE_INTEGER {
struct { DWORD LowPart, HighPart; } u;
ULONGLONG QuadPart;
} ULARGE_INTEGER;
| 函式 | 原型 | 說明 |
|---|---|---|
| DeleteFile | BOOL DeleteFile(LPCTSTR lpFileName); | 刪除檔案,目錄需用 RemoveDirectory |
| CopyFile | BOOL CopyFile(LPCTSTR src, LPCTSTR dst, BOOL failIfExists); | failIfExists=TRUE 目標存在時失敗 |
| MoveFile | BOOL 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 進度回呼std::filesystem::copy/rename/remove