windows系统下递归遍历目录下的所有文件

c++代码如下:

int GetAllFilepathFromfolder(char*  Path)
{
    char szFind[MAX_PATH];
    WIN32_FIND_DATA FindFileData;
    strcpy(szFind,Path);
    strcat(szFind,"\\*.*");//再路劲后加"*.*"标识当前目录下的所有文件和目录
    HANDLE hFind=FindFirstFile(szFind,&FindFileData);
    if(INVALID_HANDLE_VALUE == hFind)   
        return -1;

    do
    {
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//如果文件属性是目录
        {
            if(strcmp(FindFileData.cFileName,".")!=0 &&    strcmp(FindFileData.cFileName, "..")!=0)//过滤掉"."和".."目录
            {
                //发现子目录,递归之
                char szFile[MAX_PATH] = {0};
                strcpy(szFile,Path);
                strcat(szFile,"\\");
                strcat(szFile,FindFileData.cFileName);
                GetAllFilepathFromfolder(szFile);
            }
        }
        else
        {
            //如果是文件,则直接处理之
            std::cout << lpPath << "\\" << FindFileData.cFileName << std::endl;
        }
    }while(FindNextFile(hFind,&FindFileData));

    FindClose(hFind);

    return 0;
}

原理如下:

typedef struct _WIN32_FIND_DATA {
DWORD dwFileAttributes;            //文件属性
FILETIME ftCreationTime;           // 文件创建时间
FILETIME ftLastAccessTime;         // 文件最后一次访问时间
FILETIME ftLastWriteTime;          // 文件最后一次修改时间
DWORD nFileSizeHigh;               // 文件长度高32位
DWORD nFileSizeLow;                // 文件长度低32位
DWORD dwReserved0;                 // 系统保留
DWORD dwReserved1;                 // 系统保留
TCHAR cFileName[ MAX_PATH ];       // 长文件名
TCHAR cAlternateFileName[ 14 ];    // 8.3格式文件名
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;

1.dwFileAttributes,文件属性字段,通过此字段可以检查到究竟是一个文件还是一个子目录,以及其他的文件属性,此字段可取如下值:
●FILE_ATTRIBUTE_ARCHIVE        ——文件包含归档属性。
●FILE_ATTRIBUTE_COMPRESSED     ——文件和目录被压缩。
●FILE_ATTRIBUTE_DIRECTORY      ——找到的是一个目录。
●FILE_ATTRIBUTE_HIDDEN         ——文件包含隐含属性。
●FILE_ATTRIBUTE_NORMAL         ——文件没有其他属性。
●FILE_ATTRIBUTE_READONLY       ——文件包含只读属性。
●FILE_ATTRIBUTE_SYSTEM         ——文件包含系统属性。
●FILE_ATTRIBUTE_TEMPORARY      ——文件是一个临时文件。
2.cFileName,长文件名,返回的文件名中会包含"."和"..","."为当前目录,".."为上级目录,需要过滤掉;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值