美文网首页
解决办法:_findnext()报错

解决办法:_findnext()报错

作者: 有事没事扯扯淡 | 来源:发表于2020-09-24 15:29 被阅读0次

最近用到一个小函数,出现了bug记录一下。用c++遍历文件夹下所有文件并返回路径。(下面是脚本,网上搜一下很多)

  1. 搜索子文件夹
#include <io.h>
#include <string>
#include <vector>
#include <fstream>

void getAllFiles(string path, vector<string>& files) {
    //文件句柄
    long hFile = 0;
    //文件信息
    struct _finddata_t fileinfo;  
    string p;  
    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
        do {
            if ((fileinfo.attrib & _A_SUBDIR)) {  //比较文件类型是否是文件夹
                if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {
                    files.push_back(p.assign(path).append("\\").append(fileinfo.name));
                    //递归搜索
                    getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);
                }
            }
            else {
                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
        _findclose(hFile);
    }
}

2.不搜索子文件夹

void getAllFiles(string path, vector<string>& files) 
{
    // 文件句柄
    long hFile = 0;
    // 文件信息
    struct _finddata_t fileinfo;  

    string p;

    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
        do {
            // 保存文件的全路径
            files.push_back(p.assign(path).append("\\").append(fileinfo.name));

           } while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1

        _findclose(hFile);
    }
}

3.所有文件夹下指定后缀文件

void getAllFiles(string path, vector<string>& files) {
    //文件句柄
    long hFile = 0;
    //文件信息
    struct _finddata_t fileinfo;  
    string p;  
    if ((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) != -1) {
        do {
            if ((fileinfo.attrib & _A_SUBDIR)) {  //比较文件类型是否是文件夹
                if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0) {
                    files.push_back(p.assign(path).append("\\").append(fileinfo.name));
                    //递归搜索
                    getAllFiles(p.assign(path).append("\\").append(fileinfo.name), files);
                }
            }
            else {
                files.push_back(p.assign(path).append("\\").append(fileinfo.name));
            }
        } while (_findnext(hFile, &fileinfo) == 0);  //寻找下一个,成功返回0,否则-1
        _findclose(hFile);
    }
}

重点!!!

Win10下报错, 使用文件遍历函数_findnext会报0xC0000005错误 !!(Win7下没有问题)

因为,_findnext()第一个参数”路径句柄”,返回的类型为intptr_t(long long),如果定义为long,在win7中是没有问题,但是在win10中就要改为long long或者intptr_t

最简单的,直接修改类型即可:

intptr_t hFile = 0;

[参考链接]
https://www.cnblogs.com/whlook/p/6993579.html
https://blog.csdn.net/lihaidong1991/article/details/89396565

相关文章

网友评论

      本文标题:解决办法:_findnext()报错

      本文链接:https://www.haomeiwen.com/subject/jxazyktx.html