WIN32_FIND_DATA 详细结构(附循环读取文件代码)

news/2024/7/23 11:10:59
//去除路径最后多余的斜杠和反斜杠
std::string TrimPath(std::string path)
{
    //string test3("内容");   使用引用字符数组作为参数传给构造函数
    std::string illegal(" \t\f\v\n\r\\/");//string 赋值
    size_t pos = path.find_last_not_of(illegal);//从后往前查找与illegal不匹配的第一个位置,返回的是下标不是位数
    return path.substr(0, pos + 1);
}
//获取当前路径下的所有的图片文件,输入绝对路径,输出完整路径
int FindImages(std::string path, std::vector<std::string>& output)
{
    const size_t FILE_TYPE = 10;
    const char* support_format[FILE_TYPE] = { ".bmp", ".dib",             //Windows bitmaps
        ".jpeg", ".jpg",           //JPEG files
        ".png",                    //Portable Network Graphics
        ".pbm", ".pgm", ".ppm",    //Portable image format
        ".tiff", ".tif" }; //TIFF files

    std::string trim_path = TrimPath(path);
    const char* lpPath = trim_path.c_str();
    char szFind[MAX_PATH];
    int n = 0;

    WIN32_FIND_DATAA FindFileData;

    strcpy_s(szFind, lpPath);
    strcat_s(szFind, "/*.*");

    HANDLE hFind = ::FindFirstFileA(szFind, &FindFileData);//创建搜索句柄
    if (INVALID_HANDLE_VALUE == hFind)
    {
        return 0;
    }

    int i = 0;

    do
    {
        if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))//判断查找的是不是文件夹,通过位于运算,dwFileAttributes有很多属性
        {
            bool is_img = false;
            for (size_t i = 0; i != FILE_TYPE; i++)
            {
                std::string lower_name(FindFileData.cFileName);
                transform(lower_name.begin(), lower_name.end(),
                    lower_name.begin(), tolower); //tolower是大写转换成小写的操作,将lower_name全部小写,再存入lower_name
                const char* lower_char = lower_name.c_str();//转换成c语言风格
                //lower_char中含有图片格式,则is_img=true
                if (is_img = bool(strstr(lower_char, support_format[i])))
                    //strstr函数是看第二个参数是不是第一个参数的子串,如果是返回str2在str1中首次出现的地址,否则返回NULL
                {
                    break;
                }
            }
            if (is_img)
            {
                n++;
                std::string img_full_path = lpPath;
                img_full_path += "/";
                img_full_path += FindFileData.cFileName; //这里输出完整路径
                output.push_back(img_full_path);//output是引用类型
            }
        }
        ++i;
    } while (FindNextFileA(hFind, &FindFileData));//当下一个文件目录不存在的时候退出循环
    FindClose(hFind);//关闭搜索句柄
    return n;
}

WIN32_FIND_DATA结构描述了一个由FindFirstFile, FindFirstFileEx, 或FindNextFile函数查找到的文件信息,

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;

可以通过FindFirstFile()函数根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去:

WIN32_FIND_DATA ffd ;

HANDLE hFind = FindFirstFile("c:\\test.dat",&ffd);

在使用这个结构时不能手工修改这个结构中的任何数据,结构对于开发人员来说只能作为一个只读数据,其所有的成员变量都会由系统完成填写。在MSDN帮助中可以查找到关于WIN32_FIND_DATA结构的更加详细的说明。

if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

这个判断语句是通过 将dwFileAttributes和FILE_ATTRIBUTE_DIRECTORY做位的与运算
来判断所找到的项目是不是文件夹

因为 FindFirstFile返回的 findData 中 dwFileAttributes项的值

可能是
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_TEMPORARY
中几项的组合值

findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
的结果只能是两种:
FILE_ATTRIBUTE_DIRECTORY 非零值 ,if条件是真
0 ,if条件是假

通过 findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
可以判断 dwFileAttributes项的值中是否 FILE_ATTRIBUTE_DIRECTORY,即判断所找到的项目是不是文件夹

摘自:http://st251256589.blog.163.com/blog/static/164876449201132074828542/

转载于:https://www.cnblogs.com/qinguoyi/p/7252463.html


http://www.niftyadmin.cn/n/4596939.html

相关文章

不公平才是世界的真相----摘自罗辑思维

不公平才是世界的真相如果让你来模拟上帝。给世界上全部人分配財富。你必须依照什么原则分配&#xff0c;才会得到一个与真实世界差点儿相同的结果呢&#xff1f;首先你不可能均匀分配&#xff0c;否则世界上就不会有穷人和富人的差别。你可能会考虑随心情分配&#xff0c;今天…

vue通讯e

在这里插入代码片 父级向子级通讯(利用props)父级&#xff1a;data(){return{**tit:加油加油 &#xff01;**}}子级&#xff1a;props:[tit] 接收<val1 :tit"tit"></val1>子级向父级通讯(利用回调函数)子级&#xff1a;this.$emit(solgan,this.val)父级&…

项目上线相关配置配置 https服务

项目上线相关配置 使用pm2管理应用 1在服务器安装 pm2 :npm i pm2 -g 启动项目 pm2 start 脚本 --name 自定义名称 查看运行项目 pm2ls 重启项目 pm2 restart 自定义名称 停止项目 pm2stop自定义名称 删除项目pm2delete自定义名称 ***## 在这里插入代码片*** 配置 https服务 ht…

为何游戏公司青睐工作室制度

在传统游戏公司转向手游之后&#xff0c;工作室的模式变得越来越流行起来。 早期传统游戏业的生产方式普遍是集团军项目制&#xff0c;这种组织形式一般都是集团共同分配大锅饭&#xff0c;往往造成一部分产品的研发周期长、出品见效慢、产品质量无法保障、内部管理混乱等问题。…

Activity生命周期(待整理)

1. 定义 有一些方法共同定义生命周期&#xff0c;如下图示&#xff1a;&#xff08;图片来自于官网文档&#xff09; 2. onStart()——在Activity即将对用户可见之前调用 &#xff08;1&#xff09;Activity启动动画、二维动画在onStart()中编写 &#xff08;2&#xff09;传感…

阿里云服务器CentOS7.0安装Nginx 1.12.1

一、安装准备首先由于nginx的一些模块依赖一些lib库&#xff0c;所以在安装nginx之前&#xff0c;必须先安装这些lib库&#xff0c;这些依赖库主要有g、gcc、openssl-devel、pcre-devel和zlib-devel 所以执行如下命令安装 yum install gcc-c yum install pcre pcre-devel yum…

用Python多线程实现生产者消费者模式

什么是生产者消费者模式 在软件开发的过程中&#xff0c;经常碰到这样的场景&#xff1a; 某些模块负责生产数据&#xff0c;这些数据由其他模块来负责处理(此处的模块可能是&#xff1a;函数、线程、进程等)。产生数据的模块称为生产者&#xff0c;而处理数据的模块称为消费者…

es6扩展

在这里插入代码片 // 获取函数所有形参// es5let fun function(){console.log(arguments); // 类数组[...arguments].forEach(item>{// 通过...把它转为一个数组console.log(item);})}fun(1,2,3,4,5)// es6// 箭头函数没有arguments对象// reset 参数返回一个实参的数组的集…