四、磁盤和驅動器管理
1.判斷光驅中是否有光盤/* ***************************************************************** * cdrom.c 判斷光驅中是否有光盤 * ****************************************************************/ /*頭文件*/ #include <Windows.h> #include <stdio.h> #include <tchar.h> /*預定義*/ #define BUFSIZE 512 /* *************************************************************** * int main(int argc,PCHAR argv[]) * 功能:應用程序主函數,根據輸入的驅動器 * 根路徑參數判斷是否為光驅,是否放入光盤 * 參數:驅動器根路徑,比如“D:\” * **************************************************************/ int main(int argc,PCHAR argv[]) { //存儲文件系統類別名 CHAR szFileSystemNameBuffer[BUFSIZE]; DWORD dwLastError; DWORD dwSystemFlags; //判斷輸入運行時參數 if (argc != 2) { printf("請輸入驅動器的根路徑,比如:\"D:\\\"\n"); return -1; } //判斷驅動器是否是否為CD\DVD ROM if (GetDriveType(argv[1]) != DRIVE_CDROM) { printf("驅動器%s不是CD/DVD ROM.\n",argv[1]); return -1; } //獲取卷信息 if (!GetVolumeInformation( argv[1],NULL,0, NULL,NULL, &dwSystemFlags, szFileSystemNameBuffer, BUFSIZE )) { dwLastError = GetLastError(); if (dwLastError == 21) { printf("設備未就緒,請放入光盤!\n"); return 0; } else { printf("GetVolumeInfomation 錯誤 %d\n",dwLastError); } } printf("光盤已經放入,文件系統類別%s.\n",szFileSystemNameBuffer); return 0; } 2.獲取磁盤分區的總容量、空閒容量、簇、扇區信息 (1)GetDiskFreeSpace 功能: 獲取驅動器根路徑作為輸入,獲取磁盤空間信息,包括每簇的扇區數、每扇區的字節數、簇數量、空間簇數量 函數原型: BOOL GetDiskFreeSpace( LPCTSTR lpRootPathName, LPDWORD lpSectorsPerCluster, LPDWORD lpBytesPerSector, LPDWORD lpNumberOfFreeClusters, LPDWORD lpTotalNumberOfClusters ); 參數: lpRootPathName:輸入參數,指向所獲取磁盤空間信息的磁盤分區根路徑字符串。 lpSectorsPerCluster:輸出參數,指針,指向存儲每扇區數的DWORD類型變量。 lpBytesPerSector:輸出參數,指針,指向存儲空間簇的DWORD類型的變量。 lpTotalNumberOfCluster:輸出參數,指針,指向存儲總簇數的DWORD類型變量。 返回值: 返回BOOL值,表示信息獲取成功。 (2)GetDiskFreeSpaceEx 功能: 獲取驅動器根路徑作為輸入,獲取用戶可用的空間的字節數、空閒空間的字節數、磁盤總容量字節數 函數原型: BOOL GetDiskFreeSpaceEx( LPCTSTR lpDirectoryName, PULARGE_INTEGER lpFreeBytesAvailable, PULARGE_INTEGER lpTotalNumberOfBytes, PULARGE_INTEGER lpTotalNumberOfFreeBytes ); 參數: lpDirectoryName:輸入參數,指向所獲取磁盤空間信息的磁盤分區根路徑字符串。 lpFreeBytesAvailable:輸出參數,指針,指向用於存儲可獲得的總字節數量的變量。 lpTotalNumberOfBytes:輸出參數,指針,指向存儲磁盤空間總字節數據的變量。 lpTotalNumberOfFreeBytes:輸出參數,指針,指向存儲磁盤空間總字節的變量。 返回值: 返回BOOL值,表示信息獲取成功。 (3)關鍵數據結構 typedef union _ULARGE_INTEGER{ struct { DWORD LowPart, DWORD HighPart, }; struct { DWORD LowPart, DWORD HighPart }u; ULONGLONG QuadPart; }ULARGE_INTEGER,*PULARGE_INTEGER; (4)使用GetDiskFreeSpace系列函數獲取磁盤空間信息 /* ****************************************************************** * diskspace.c獲取磁盤空間信息 * *****************************************************************/ /*頭文件*/ #include<Windows.h> #include <stdio.h> /* *************************************************************** * BOOL GetDiskSpaceInfo(LPCSTR pszDrive) * 功能:根據輸入驅動器,獲取磁盤總容量 * 空閒空間、簇數量等磁盤信息 * 參數:驅動器根路徑,比如“D:\” * *************************************************************/ BOOL GetDiskSpaceInfo(LPCSTR pszDrive) { DWORD64 qwFreeBytesToCaller,qwTotalBytes,qwFreeBytes; DWORD dwSectPerClust,dwBytesPerSect,dwFreeClusters,dwTotalClusters; BOOL bResult; //使用GetDiskFreeSpaceEx獲取磁盤信息並打印結果 bResult = GetDiskFreeSpaceEx( pszDrive, (PULARGE_INTEGER)&qwFreeBytesToCaller, (PULARGE_INTEGER)&qwTotalBytes, (PULARGE_INTEGER)&qwFreeBytes ); if (bResult) { printf("使用GetDiskFreeSpaceEx獲取磁盤空間信息\n"); printf("可獲得的磁盤空間(字節):\t%I64d\n",qwFreeBytesToCaller); printf("空閒空間(字節):\t\t%I64d\n",qwFreeBytes); printf("磁盤總容量(字節):\t\t%I64d\n",qwTotalBytes); } //使用GetDiskFreeSpace獲取磁盤信息並打印結果 bResult = GetDiskFreeSpace( pszDrive, &dwSectPerClust, &dwBytesPerSect, &dwFreeClusters, &dwTotalClusters ); if (bResult) { printf("\n使用GetDiskFreeSpace獲取磁盤空間信息\n"); printf("空閒的簇數量:\t\t\t%d\n",dwFreeClusters); printf("總簇數量:\t\t\t%d\n",dwTotalClusters); printf("每簇的扇區數量:\t\t\t%d\n",dwSectPerClust); printf("每個扇區的容量(字節):\t\t\t%d\n",dwBytesPerSect); printf("空閒空間(字節):\t\t\t%d\n",(DWORD64)dwFreeClusters*(DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect); printf("磁盤總容量(字節):\t\t\t%d\n",(DWORD64)dwTotalClusters*(DWORD64)dwSectPerClust*(DWORD64)dwBytesPerSect); } return bResult; } /* ************************************************************************************** * int main(int argc,PCHAR argv[]) * 功能:應用程序主函數,根據輸入參數 * 調用GetDiskSpaceInfo函數獲取 * 磁盤空間信息 * 參數:驅動器根路徑,比如“D:\” * **************************************************************************************/ int main(int argc,PCHAR argv[]) { GetDiskSpaceInfo(argv[1]); } 五、文件和目錄管理 文件和目錄管理是Windows編程的最為基本的功能。 1.刪除、復制、重命名、移動文件 (1)DeleteFile 函數原型: BOOL DeleteFile{ LPCTSTR lpFileName; //所要刪除文件的相對路徑或者絕對路徑 } (2)CopyFile 函數原型: BOOL CopyFile{ LPCTSTR lpExistingFileName, //已存在的所需復制文件的源路徑 LPCTSTR lpNewFileName, //新文件路徑 BOOL bFailIfExists //指明如在目的路徑存在文件時是否覆蓋 } (3)MoveFile 函數原型: BOOL MoveFile{ LPCTSTR lpExistingFileName, //為已存在的所需移動的文件的源路徑 LPCTSTR lpNewFileName //新文件路徑 } (4)刪除、復制、移動文件 /* ******************************************************************** * file.c刪除、復制、重命名、移動文件 * *******************************************************************/ /*頭文件*/ #include <Windows.h> #include <stdio.h> /* ******************************************************************** * int main(int argc,PCHAR argv[]) * 功能:應用程序主函數,根據輸入參數 * 刪除、復制、重命名文件 * 參數:刪除文件: * -d文件路徑 * 將文件路徑1的文件復制到文件路徑2: * -c文件路徑1 文件路徑2 * 將文件路徑1的文件移動、重命名為文件路徑2的文件: * -m文件路徑1 文件路徑2 * ***********************************************************************/ int main(int argc,PCHAR argv[]) { //-d參數,刪除文件 if (0 == lstrcmp("-d",argv[1]) && argc == 3) { if (!DeleteFile(argv[2])) { printf("刪除文件錯誤:%x\n",GetLastError()); } else { printf("刪除成功!\n"); } } //-c參數,復制文件 //如果文件存在,詢問用戶是否覆蓋 else if (0 == lstrcmp("-c",argv[1]) && argc == 4) { //復制,不覆蓋已存在的文件 if (!CopyFile(argv[2],argv[3],TRUE)) { //LastError == 0x50,文件存在 if (GetLastError() == 0x50) { printf("文件%s已經存在,是否覆蓋?y/n:",argv[3]); if ('y' ==getchar()) { //復制,覆蓋已存在文件 if (!CopyFile(argv[2],argv[3],FALSE)) { printf("復制文件錯誤:%d\n",GetLastError()); } else { printf("復制成功!\n"); } } else { return 0; } } } else { printf("復制成功!\n"); } } //-m參數,移動、重命名文件 else if (0 ==lstrcmp("-m",argv[1]) && argc == 4) { if (!MoveFile(argv[2],argv[3])) { printf("移動文件錯誤:%d\n",GetLastError()); } else { printf("移動文件成功!\n"); } } else { printf("參數錯誤!\n"); } }