遍历某目录下所有子文件

WIN32_FIND_DATA

关于文件的全部属性信息。总计有以下以下9种:
文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。
在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。
在用findfirst()和findnext()函数去查找磁盘文件时经常使用的一个数据结构WIN32_FIND_DATA的成员变量里包含了以上所有的文件属性,因此可以通过这个结构作为获取和更改文件属性的手段。该结构的内容如下:
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;
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——文件是一个临时文件

可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:
WIN32_FIND_DATA ffd ;
HANDLE hFind = FindFirstFile(“c:\test.dat”,&ffd);
在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明。
收藏

FindFirstFile
根据文件名查找文件。该函数到一个文件夹(包括子文件夹)去搜索指定文件 如果要使用附加属性去搜索文件的话 可以使用FindFirstFileEx函数。Long,如执行成功,返回一个搜索句柄。如果出错,返回一个INVALID_HANDLE_VALUE常数,一旦不再需要,应该用FindClose函数关闭这个句柄
LPCTSTR lpFileName文件名(包括路径)
LPWIN32_FIND_DATA lpFindFileData 指向一个用于保存文件信息的结构体
参数 类型及说明
lpFileNameString,欲搜索的文件名。参数可如下

  • c:\Windows*.*//在c:\Windows目录中查找所有文件
  • c:\Windows\System32*.dll//在c:\Windows\System32目录中查找所有dll文件

  • c:\Windows\System.ini;在c:\Windows目录中查找System.ini文件

  • c:\Windows\a???.*//在c:\Windows目录中查找所有以a开头的文件名长度.为4个字符的文件
  • Test.dat//在当前目录查找Test.dat文件
  • .//在当前目录查找所有文件

(注!一定要带文件名。如果参数为“c:\Windows”,则返回的文件名为“Windows”,并且接下来调用FindNextFile会返回失败)
lpFindFileDataWIN32_FIND_DATA,这个结构用于装载与找到的文件有关的信息。该结构可用于后续的搜索
如果调用成功返回一个句柄,可用来做为FindNextFile或 FindClose参数
调用失败 返回为INVALID_HANDLE_VALUE(即-1) ,可调用GetLastError来获取错误信息

FindNextFile
hFindFile Long,上一次查找返回的文件句柄
lpFindFileData WIN32_FIND_DATA,这个结构用于装载与找到的文件有关的信息。该结构可用于后续的搜索继续查找FindFirstFile函数搜索后的文件
非零表示成功,零表示失败。如不再有与指定条件相符的文件,会将GetLastError设置成ERROR_NO_MORE_FILES

示例:

#include <windows.h>
#include <stdio.h>
#include <string.h>
int findFile(char filePath[] , long long Num , long long Directory)
{
    //定义文件路径
    char szFind[MAX_PATH];

    //定义结构和句柄
    WIN32_FIND_DATA FindFileData;
    HANDLE hFind;

    //将输入的目录赋值到路径下
    strcpy(szFind,filePath);
    //添加\\*.*,以表示所有文件,不包括默认目录(.和..),但包括其他目录
    strcat(szFind,"\\*.*");

    //调用FindFirstFile()函数来查找下一个文件
    hFind=FindFirstFile(szFind,&FindFileData);
    if(INVALID_HANDLE_VALUE==hFind)
    {
        printf("目录不存在");
        return 0;
    }
    while(1)
    {
        //查找到的是一个目录
        if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            //cFileName存储文件名(不含路径)
            //表示当前目录,因为每个目录下面都有两个默认目录
            //就是..和.分别表示上一级目录和当前目录
            //排除.和..目录
            if(FindFileData.cFileName[0]!='.')
            {
                printf("%s&&&&&\n",FindFileData.cFileName);
                Directory++;
                //递归调用findFile()函数来查找子文件夹下文件
                strcpy(szFind,filePath);
                strcat(szFind,"\\");
                strcat(szFind,FindFileData.cFileName);
                findFile(szFind,Num,Directory);
            }
        }
        else
        {
            Num++;

            //打印函数
            printf("%s\\%s\n%d\n",filePath,FindFileData.cFileName,FindFileData.nFileSizeLow);
        }

        //找到返回真,即不break;
        if(!FindNextFile(hFind,&FindFileData))
            break;
    }

    //关闭句柄
    FindClose(hFind);
    return 0;
}

int main()
{
    long long Size=0,Num=0,Directory=0;
    char input[MAX_PATH];
    printf("输入想要遍历的目录。如:C:\\\\windows 或C:\\\\Documents and Settings\n");
    scanf("%s",input);
    findFile(input,Num,Directory);
    system("pause");
    return 0;
}

摘录自:百度~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值