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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值