win32下,遞歸遍歷目錄樹

win32下,遞歸遍歷目錄樹

以下代碼取自《Windows API開發詳解》,修改、屏蔽了報錯部分內容,可在Visual Studio 2015上運行,屏蔽了無法運行部分。

/*********************************************************
* tree.c 遞歸遍歷目錄樹
**********************************************************/
/* 頭文件 */
#include <Windows.h>
#include <stdio.h>

/* 預處理聲明 */
#pragma comment (lib, "User32.lib")

/* 函數聲明 */
DWORD ListAllFileInDirectory(LPWSTR szPath);

/* 全局變量 */
// 記錄所有的文件和目錄
DWORD dwTotalFileNum = 0;

/*********************************************************
* DWORD ListAllFileInDirectory(LPSTR szPath)
* 功能:遍歷目錄及所有子目錄,打印路徑
* 參數:LPSTR szPath,爲需遍歷的目錄
* 返回值:0代表執行完成,1代表發生錯誤
*********************************************************/
DWORD ListAllFileInDirectory(LPWSTR szPath)
{
    WCHAR szFilePath[MAX_PATH];
    WIN32_FIND_DATA FindFileData;
    HANDLE hListFile;
    WCHAR szFullPath[MAX_PATH];

    // 構造代表子目錄和文件夾路徑的字符串,使用通配符“*”
    lstrcpy(szFilePath, szPath);
    lstrcat(szFilePath, L"\\*");

    // 查找第一個文件目錄,獲得查找句柄
    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);
            lstrcpy(szFullPath, szPath);
            lstrcat(szFullPath, L"\\");
            lstrcat(szFullPath, FindFileData.cFileName);

            dwTotalFileNum++;

            // 打印
            printf("\n%d\t%ws\t", dwTotalFileNum, szFullPath);
            // 如果是目錄,則遞歸調用,列舉下級目錄
            if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                printf("<DIR>");
                ListAllFileInDirectory(szFullPath);
            }
        } while (FindNextFile(hListFile, &FindFileData));
    }
    return 0;
}

/***************************************************************
* int main(int argc, PCHAR argv[])
*
* 功能:調用ListAllFileInDirectory遍歷目錄下的文件和子目錄
*
* 參數:argv[1]爲需遍歷的路徑,如果爲空則獲取當前路徑
***************************************************************/
int main(int argc, PCHAR argv[])
{
    //if (argc == 2)
    //{
    //  ListAllFileInDirectory(argv[1]);
    //}
    //else
    {
        WCHAR szCurrentPath[MAX_PATH];
        GetCurrentDirectory(MAX_PATH, szCurrentPath);
        ListAllFileInDirectory(szCurrentPath);
    }
    return 0;
}
發佈了33 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章