五、文件和目錄管理
4.獲取程序所在的目錄、程序模塊路徑,獲取和設置當前目錄 /* **************************************************************************** * cur_mod_dir.c 獲取當前是目錄、獲取程序所在目錄,獲取模塊路徑 * ***************************************************************************/ #include <Windows.h> #include <stdio.h> /* ********************************************************************* * int main(void) * 功能:演示使用設置獲取當前路徑 * 演示獲取模塊路徑 * ********************************************************************/ int main(void) { //用於存儲當前路徑 CHAR szCurrentDirectory[MAX_PATH]; //用於存儲模塊路徑 CHAR szMoudlePath[MAX_PATH]; //Kernel32文件名與句柄 LPSTR szkernel32 = "kernel32.dll"; HMODULE hKernel32; //當前路徑的長度,也用於判斷獲取是否成功 DWORD dwCurDirPathLen; //獲取進程當前目錄 dwCurDirPathLen = GetCurrentDirectory(MAX_PATH,szCurrentDirectory); if (dwCurDirPathLen == 0) { printf("獲取當前目錄錯誤。\n"); return 0; } printf("進程當前目錄為%s\n",szCurrentDirectory); //將進程當前目錄設置為“C:\” lstrcpy(szCurrentDirectory,"C:\\"); if (!SetCurrentDirectory(szCurrentDirectory)) { printf("設置當前目錄錯誤。\n"); return 0; } printf("已經設置為當前目錄為%s\n",szCurrentDirectory); //在當前目下創建子目錄“current_dir” //運行完成後C:盤下將文件夾“current_dir” CreateDirectory("Current_dir",NULL); //再次獲取系統當前目錄 dwCurDirPathLen = GetCurrentDirectory(MAX_PATH,szCurrentDirectory); if (dwCurDirPathLen == 0) { printf("獲取當前目錄錯誤。\n"); return 0; } printf("GetCurrentDirectory獲取當親目錄為%s\n",szCurrentDirectory); //使用NULL參數,獲取本模塊的路徑 if (!GetModuleFileName(NULL,szMoudlePath,MAX_PATH)) { printf("獲取本模塊路徑錯誤!\n"); return 0; } printf("本模塊路徑%s\n",szMoudlePath); //獲取Kernal32.dll的模塊句柄 hKernel32 = LoadLibrary(szkernel32); //使用Kernel32.dll的模塊句柄,獲取其路徑 if (!GetModuleFileName(hKernel32,szMoudlePath,MAX_PATH)) { printf("獲取模塊路徑錯誤。\n"); return 0; } printf("kernel32模塊路徑%s\n",szMoudlePath); return 0; } 5.查找文件、遍歷指定目錄下的文件和子目錄 /* *********************************************************************** * sub_dir.c 遍歷目錄下的文件和子目錄 * **********************************************************************/ #include <Windows.h> #include <stdio.h> /* ********************************************************************* * DWORD EnumerateFileInDrectory(LPSTR szPath) * 功能:遍歷目錄下的文件和子目錄,將顯示 * 文件和文件夾隱藏、加密的屬性 * 參數:LPTSTR szPath,為需遍歷的路徑 * 返回值:0代表執行完成,1代表代碼發生錯誤 * ********************************************************************/ DWORD EnumerateFileInDrectory(LPSTR szPath) { WIN32_FIND_DATA FindFileData; HANDLE hListFile; CHAR szFilePath[MAX_PATH]; //構造代表子目錄和文件夾路徑的字符集,使用通配符“*” lstrcpy(szFilePath,szPath); //注釋的代碼可以用於查找所有以“.txt”結尾的文件 //lstrcat(szFilePath,"\\*.txt"); lstrcat(szFilePath,"\\*"); //查找第一個文件/目錄,獲得查找句柄 hListFile = FindFirstFile(szFilePath,&FindFileData); //判斷句柄 if (hListFile == INVALID_HANDLE_VALUE) { printf("錯誤:%d\n",GetLastError()); return 1; } else { do { /*如果不想顯示本級目錄和上級目錄的“.”和“..”,可以使用注釋部分的代碼過濾 if (lstrcmp(FindFileData.cFileName,TEXT(".")) == 0 || lstrcmp(FindFileData.cFileName,TEXT("..")) == 0) { continue; } */ //打印文件名、目錄名 printf("%s\t\t",FindFileData.cFileName); //判斷文件屬性,是否為加密文件或文件夾 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_ENCRYPTED) { printf("<加密>"); } //判斷文件屬性,是否為隱藏文件或文件夾 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) { printf("<隱藏>"); } //判斷文件屬性,是否為目錄 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("<DIR>"); } //讀者可根據文件屬性自行添加、判斷文件屬性 printf("\n"); } while (FindNextFile(hListFile,&FindFileData)); } return 0; } /* *********************************************************************************** * int main(int argc,PCHAR argv[]) * 功能:調用ListFileInDrectory * 遍歷目錄下的文件和子目錄 * 參數:argv[1]為需遍歷的路徑,如果為空則獲取當前路徑 * **********************************************************************************/ int main(int argc,PCHAR argv[]) { if (argc == 2) { EnumerateFileInDrectory(argv[1]); } else { CHAR szCurrentPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szCurrentPath); EnumerateFileInDrectory(szCurrentPath); } return 0; } 6.遞歸遍歷目錄樹 /* *************************************************************** * tree.c 遞歸遍歷目錄樹 * **************************************************************/ /*頭文件*/ #include <Windows.h> #include <stdio.h> /*預處理申明*/ #pragma comment (lib,"user32.lib") /*函數申明*/ DWORD ListAllFileInDrectory(LPSTR szPath); /*全局變量*/ //記錄所有的文件和目錄數 DWORD dwTotalFileNum = 0; /* ************************************************************** * DWORD ListAllFileInDrectory(LPSTR szPath) * 功能:遍歷目錄及所有子目錄,打印路徑 * 參數:LPTSTR szPath 為需遍歷的目錄 * 返回值:0代表執行完成,1代表發生錯誤 ****************************************************************/ DWORD ListAllFileInDrectory(LPSTR szPath) { CHAR szFilePath[MAX_PATH]; WIN32_FIND_DATA FindFileData; HANDLE hListFile; CHAR szFullPath[MAX_PATH]; //構造代表子目錄和文件夾路徑的字符集,使用通配符“*” lstrcpy(szFilePath,szPath); lstrcat(szFilePath,"\\*"); //查找第一個文件目錄,獲得查找句柄 hListFile = FindFirstFile(szFilePath,&FindFileData); if (hListFile == INVALID_HANDLE_VALUE) { printf("錯誤:%d",GetLastError()); return 1; } else { do { //過濾“.”和“..”,不需要遍歷 if (lstrcmp(FindFileData.cFileName,TEXT(".")) == 0 || lstrcmp(FindFileData.cFileName,TEXT("..")) == 0) { continue; } //構造成全路徑 wsprintf(szFullPath,"%s\\%s",szPath,FindFileData.cFileName); dwTotalFileNum++; //打印 printf("\n%d\t%s\t",dwTotalFileNum,szFullPath); //如果是目錄,則遞歸調用,列舉下級目錄 if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { printf("<DIR>"); ListAllFileInDrectory(szFullPath); } } while (FindNextFile(hListFile,&FindFileData)); } return 0; } /* *************************************************************************************** * int main(int argc,PCHAR argv[]) * 功能:調用ListAllFileInDrectory * 遍歷目錄下的文件和子目錄 * 參數:argv[1]為需要遍歷的路徑,如果為空則獲取當前路徑 * ***************************************************************************************/ int main(int argc,PCHAR argv[]) { if (argc == 2) { ListAllFileInDrectory(argv[1]); } else { CHAR szCurrentPath[MAX_PATH]; GetCurrentDirectory(MAX_PATH,szCurrentPath); ListAllFileInDrectory(szCurrentPath); } return 0; }