zoukankan      html  css  js  c++  java
  • C++用 _findfirst 和 _findnext 查找文件

    一、这两个函数均在io.h里面。
     
    二、首先了解一下一个文件结构体:
    struct _finddata_t {
        unsigned    attrib;
        time_t      time_create;   
        time_t      time_access;   
        time_t      time_write;
        _fsize_t    size;
        char        name[260];
    };
     
    time_t,其实就是long
    而_fsize_t,就是unsigned long
     
    现在来解释一下结构体的数据成员吧。
     
    attrib,就是所查找文件的属性:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、 _A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
     
    time_create、time_access和time_write分别是创建文件的时间、最后一次访问文件的时间和文件最后被修改的时间。
     
    size:文件大小
     
    name:文件名。
     
     
    三、用 _findfirst 和 _findnext 查找文件
     
    1、_findfirst函数:long _findfirst(const char *, struct _finddata_t *);
     
    第一个参数为文件名,可以用"*.*"来查找所有文件,也可以用"*.cpp"来查找.cpp文件。第二个参数是_finddata_t结构体指针。若查找成功,返回文件句柄,若失败,返回-1。
     
     
    2、_findnext函数:int _findnext(long, struct _finddata_t *);
     
    第一个参数为文件句柄,第二个参数同样为_finddata_t结构体指针。若查找成功,返回0,失败返回-1。
     
    3、_findclose()函数:int _findclose(long);
     
    只有一个参数,文件句柄。若关闭成功返回0,失败返回-1。
     
    #include <io.h>
    #include <iostream>
    #include <fstream>
    using namespace std;
    
    bool transfer(string fileName, int exeNum );
    void dfsFolder(string folderPath, ofstream &fout);
    
    int main()
    {
        _finddata_t file;
        int k;
        long HANDLE;
        k = HANDLE = _findfirst("*.*", &file);
        while (k != -1)
        {
            cout << file.name << endl;
            k = _findnext(HANDLE, &file);
        }
        _findclose(HANDLE);
    
        transfer("C:\Windows\*.exe", 0);
        ofstream o_fstream;
    
        dfsFolder("E:\WHU\Study", o_fstream);
    
    
        return 0;
    }
    
    //_findfirst 函数返回的是匹配到文件的句柄,数据类型为long。
    //遍历过程可以指定文件类型,这通过FileName的赋值来实现,例如要遍历C : WINDOWS下的所有.exe文件
    
    bool transfer(string fileName , int exeNum)
    {
        _finddata_t fileInfo;
        long handle = _findfirst(fileName.c_str(), &fileInfo);
    
        if (handle == -1L)
        {
            cerr << "failed to transfer files" << endl;
            return false;
        }
    
        do
        {
            exeNum++;
            cout << fileInfo.name << endl;
        } while (_findnext(handle, &fileInfo) == 0);
        cout << " .exe files' number:  " << exeNum << endl;
    
        return true;
    }
    
    //遍历文件夹及其子文件夹下所有文件。操作系统中文件夹目录是树状结构,使用深度搜索策略遍历所有文件。用到_A_SUBDIR属性
    
    
    //在判断有无子目录的if分支中,由于系统在进入一个子目录时,匹配到的头两个文件(夹)是"."(当前目录),".."(上一层目录)。
    //需要忽略掉这两种情况。当需要对遍历到的文件做处理时,在else分支中添加相应的代码就好
    
    void dfsFolder(string folderPath, ofstream &fout)
    {
        _finddata_t FileInfo;
        string strfind = folderPath + "\*";
        long Handle = _findfirst(strfind.c_str(), &FileInfo);
    
        if (Handle == -1L)
        {
            cerr << "can not match the folder path" << endl;
            exit(-1);
        }
        do{
            //判断是否有子目录  
            if (FileInfo.attrib & _A_SUBDIR)
            {
                //这个语句很重要  
                if ((strcmp(FileInfo.name, ".") != 0) && (strcmp(FileInfo.name, "..") != 0))
                {
                    string newPath = folderPath + "\" + FileInfo.name;
                    dfsFolder(newPath, fout);
                }
            }
            else
            {
                fout<<folderPath.c_str() << "\" << FileInfo.name << " ";
                cout << folderPath.c_str() << "\" << FileInfo.name << endl;
            }
        } while (_findnext(Handle, &FileInfo) == 0);
    
        _findclose(Handle);
        fout.close();
    }
    
    
    //#include <iostream>    
    //#include <string>    
    //#include <io.h>    
    //using namespace std;
    //
    //int main()
    //{
    //    _finddata_t file;
    //    long longf;
    //    string tempName;
    //    //_findfirst返回的是long型; long __cdecl _findfirst(const char *, struct _finddata_t *)    
    //    if ((longf = _findfirst("E:\WHU\Study\*.*", &file)) == -1l)
    //    {
    //        cout << "文件没有找到!
    ";
    //        return 0;
    //    }
    //    do
    //    {
    //        cout << "文件列表:
    ";
    //        tempName = file.name;
    //        if (tempName[0] == '.')
    //            continue;
    //        cout << file.name<<endl;
    //
    //        if (file.attrib == _A_NORMAL)
    //        {
    //            cout << "  普通文件  ";
    //        }
    //        else if (file.attrib == _A_RDONLY)
    //        {
    //            cout << "  只读文件  ";
    //        }
    //        else if (file.attrib == _A_HIDDEN)
    //        {
    //            cout << "  隐藏文件  ";
    //        }
    //        else if (file.attrib == _A_SYSTEM)
    //        {
    //            cout << "  系统文件  ";
    //        }
    //        else if (file.attrib == _A_SUBDIR)
    //        {
    //            cout << "  子目录  ";
    //        }
    //        else
    //        {
    //            cout << "  存档文件  ";
    //        }
    //        cout << endl;
    //    } while (_findnext(longf, &file) == 0);//int __cdecl _findnext(long, struct _finddata_t *);如果找到下个文件的名字成功的话就返回0,否则返回-1   
    //
    //    _findclose(longf);
    //
    //    return 0;
    //}
  • 相关阅读:
    [译] Python 2.7.6 标准库——详见github
    [译] Python 2.7.6 标准库——15. 通用操作系统服务
    [译] Python 2.7.6 标准库——字符串
    Spark Context初始化
    Spark启动程序:Master
    Spark 0.9.0启动脚本——bin/compute-classpath.sh
    Spark 0.9.0启动脚本——bin/spark-class
    游戏开服 报一些 ip 设置 数据格式的异常,但断点明明都是数字 没问题的
    一个不错的shell脚本学习网址-很全又很简单的课程
    国外的一个代码 仓库 github --- 里面类似一个svn 的代码仓库
  • 原文地址:https://www.cnblogs.com/ranjiewen/p/5960976.html
Copyright © 2011-2022 走看看