• freecplus框架-目录操作


    一、源代码说明

    freecplus是一个Linux系统下的C/C++开源框架,源代码请前往C语言技术网(www.freecplus.net)下载。

    本文介绍的是freecplus框架的目录操作函数和类。

    函数和类的声明文件是freecplus/_freecplus.h。

    函数和类的定义文件是freecplus/_freecplus.cpp。

    示例程序位于freecplus/demo目录中。

    编译规则文件是freecplus/demo/makefile。

    二、创建目录

    在Linux下,如果想创建一个"/tmp/aaa/bbb/ccc/ddd/data.xml"的文件,必须先创建"/tmp/aaa/bbb/ccc/ddd",步骤如下:

    1)如果"/tmp"目录不存在,创建"/tmp"。

    2)如果"/tmp/aaa"目录不存在,创建"/tmp/aaa"。

    3)如果"/tmp/aaa/bbb"目录不存在,创建"/tmp/aaa/bbb"。

    4)如果"/tmp/aaa/bbb/ccc"目录不存在,创建"/tmp/aaa/bbb/ccc"。

    5)如果"/tmp/aaa/bbb/ccc/ddd"目录不存在,创建"/tmp/aaa/bbb/ccc/ddd"。

    6)创建"/tmp/aaa/bbb/ccc/ddd/data.xml"文件。

    这些操作虽然没有多少技术含量,但也很烦人。

    MKDIR函数根据绝对路径的文件名或目录名逐级的创建目录。

    函数声明:

    bool MKDIR(const char *pathorfilename,bool bisfilename=true);
    

    参数说明:

    pathorfilename:绝对路径的文件名或目录名。

    bisfilename:说明pathorfilename的类型,true-pathorfilename是文件名,否则是目录名,缺省值为true。

    返回值:true-创建成功,false-创建失败,如果返回失败,原因有大概有三种情况:1)权限不足;2)pathorfilename参数不是合法的文件名或目录名;3)磁盘空间不足。

    示例(demo30.cpp)

    /*
     *  程序名:demo30.cpp,此程序演示freecplus框架中采用MKDIR函数根据绝对路径的文件名或目录名逐级的创建目录。
     *  作者:C语言技术网(www.freecplus.net) 日期:20190525
    */
    #include "../_freecplus.h"
    
    int main()
    {
      MKDIR("/tmp/aaa/bbb/ccc/ddd",false);   // 创建"/tmp/aaa/bbb/ccc/ddd"目录。
    
      MKDIR("/tmp/111/222/333/444/data.xml",true);   // 创建"/tmp/111/222/333/444"目录。
    }
    

    三、获取目录下的文件信息

    freecplus框架把获取某目录及其子目录中的文件列表信息的功能封装成CDir类。

    类的声明:

    // 获取某目录及其子目录中的文件列表信息。
    class CDir
    {
    public:
      char m_DirName[301];        // 目录名,例如:/tmp/root。
      char m_FileName[301];       // 文件名,不包括目录名,例如:data.xml。
      char m_FullFileName[301];   // 文件全名,包括目录名,例如:/tmp/root/data.xml。
      int  m_FileSize;              // 文件的大小,单位:字节。
      char m_ModifyTime[21];      // 文件最后一次被修改的时间,即stat结构体的st_mtime成员。
      char m_CreateTime[21];      // 文件生成的时间,即stat结构体的st_ctime成员。
      char m_AccessTime[21];      // 文件最后一次被访问的时间,即stat结构体的st_atime成员。
      char m_DateFMT[21];         // 文件时间显示格式,由SetDateFMT方法设置。
    
      vector<string> m_vFileName; // 存放OpenDir方法获取到的文件名(文件全名,包括目录名)列表。
      int m_pos;                  // 已读取m_vFileName容器的位置,每调用一次ReadDir方法m_pos加1。
    
      CDir();  // 构造函数。
    
      void initdata(); // 初始化成员变量。
    
      // 设置文件时间的格式,支持"yyyy-mm-dd hh24:mi:ss"和"yyyymmddhh24miss"两种,缺省是前者。
      void SetDateFMT(const char *in_DateFMT);
    
      // 打开目录,获取目录中的文件列表信息,存放于m_vFileName容器中。
      // in_DirName,待打开的目录名,采用绝对路径,如/tmp/root。
      // in_MatchStr,待获取文件名的匹配规则,不匹配的文件被忽略。
      // in_MaxCount,获取文件的最大数量,缺省值为10000个。
      // bAndChild,是否打开各级子目录,缺省值为false-不打开子目录。
      // bSort,是否对获取到的文件列表(即m_vFileName容器中的内容)进行排序,缺省值为false-不排序。
      // 返回值:如果in_DirName参数指定的目录不存在,OpenDir方法会创建该目录,如果创建失败,返回false,还有,如果当前用户对in_DirName目录下的子目录没有读取权限也会返回false,其它正常情况下都会返回true。
      bool OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount=10000,const bool bAndChild=false,bool bSort=false);
    
      // 这是一个递归函数,用于OpenDir()的调用,在CDir类的外部不需要调用它。
      bool _OpenDir(const char *in_DirName,const char *in_MatchStr,const unsigned int in_MaxCount,const bool bAndChild);
    
      // 从m_vFileName容器中获取一条记录(文件名),同时得到该文件的大小、修改时间等信息。
      // 调用OpenDir方法时,m_vFileName容器被清空,m_pos归零,每调用一次ReadDir方法m_pos加1。
      // 当m_pos小于m_vFileName.size(),返回true,否则返回false。
      bool ReadDir();
    
      ~CDir();  // 析构函数。
    };
    

    CDir类的成员变量和函数的说明文字在类的声明中已详细描述。

    我们通过一个应用场景来演示CDir类的用法。

    先执行以下脚本生成测试目录和文件。

    mkdir /tmp/root
    mkdir /tmp/root/aaa
    mkdir /tmp/root/bbb
    cd freecplus
    cp freecplus.* /tmp/root/.
    cp demo/demo1* /tmp/root/aaa/.
    cp demo/demo2* /tmp/root/bbb/.
    cp demo/makefile /tmp/root/bbb/.
    

    执行以上脚本后,在/tmp/root目录中的目录和文件列表如下:

    在这里插入图片描述

    示例(demo32.cpp)

    /*
     *  程序名:demo32.cpp,此程序演示freecplus框架中采用CDir类获取某目录及其子目录中的文件列表信息。
     *  作者:C语言技术网(www.freecplus.net) 日期:20190525
    */
    #include "../_freecplus.h"
    
    int main()
    {
      CDir Dir;
    
      if (Dir.OpenDir("/tmp/root","*.h,*cpp",100,true,true)==false)
      {
        printf("Dir.OpenDir(/tmp/root) failed.
    "); return -1;
      }
    
      while(Dir.ReadDir()==true)
      {
        printf("filename=%s,mtime=%s,size=%d
    ",Dir.m_FullFileName,Dir.m_ModifyTime,Dir.m_FileSize);
      }
    }
    

    运行效果

    在这里插入图片描述

    注意事项:

    1)每次调用ReadDir方法后,把CDir类其它成员变量的值输出到屏幕,观察运行效果。

    2)OpenDir方法的in_MatchStr参数非常重要,在实际开发中应用广泛。

    3)如果文件名圆点"."打头,OpenDir方法将不读取这些文件,如果您希望读取这些文件,可以修改_OpenDir方法中的源代码。

    4)OpendDir方法的in_MaxCount参数设置了每次扫描目录中的文件数量,建议不超过10000,如果取值过大,打开目录的时间会比较长,还会消耗比较多的内存。

    5)OpenDir的bSort参数设置是否对m_vFileName容器进行排序,排序会消耗资源和时间,可以不排序就不排序。

    四、版权声明

    C语言技术网原创文章,转载请说明文章的来源、作者和原文的链接。
    来源:C语言技术网(www.freecplus.net)
    作者:码农有道

    如果文章有错别字,或者内容有错误,或其他的建议和意见,请您留言指正,非常感谢!!!

  • 相关阅读:
    根据进程id pid 查容器id
    jenkins 持续集成笔记1 --- 安装配置
    PMM 监控 MySQL 使用钉钉告警
    PMM 监控 MySQL
    docker HealthCheck健康检查
    顶层const和底层const
    Windows下使用VS2017搭建FLTK开发环境
    解决FAT32格式U盘安装win10时0x8007000D错误
    在VS中为C/C++源代码文件生成对应的汇编代码文件(.asm)
    VS2017设置主题和代码字体
  • 原文地址:https://www.cnblogs.com/wucongzhou/p/12613970.html
Copyright © 2020-2023  润新知