C++获取文件夹下的所有文件名

时间:2025-01-24 07:30:42

C++获取文件夹下的所有文件名

之前导师给了自己一个任务,需要获取一个目录下的所有文件名,所有就查找了相关的操作,并进行总结。

对于获取某个目录下的所有文件名,在Linux系统和Window系统中的操作是不同的,下面分别从两个系统进行介绍。

1、Windows下获取所有文件名操作

  • Window下获取所有文件名的操作主要用到了结构体struct_finddata_t,以及函数_findfirst、_findnext和_fineclse,位于头文件<>中。

  • _finddata_t结构体

struct _finddata_t
{
    unsigned attrib;//文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。
    time_t time_create;//用来存储文件创建时间
    time_t time_access;//文件的最后一次被访问的时间
    time_t time_write;//文件最后一次被修改的时间
    _fsize_t size;
    char name[_MAX_FNAME];//文件的文件名
};

 

  • 函数_findfirst()

    • 函数原型:long _findfirst( char *filespec, struct _finddata_t *fileinfo);
    • 返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。
    • 参数:filespec标明文件的完整路径,可支持通配符,比如:*.c,则表示当前文件夹下的所有后缀为C的文件。fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。
  • 函数_findnext()

    • 函数原型: int _findnext( long handle, struct _finddata_t *fileinfo );

    • 返回值:若成功返回0,否则返回-1。

    • 参数:handle:即由_findfirst函数返回回来的句柄。fileinfo:文件信息结构体的指针。找到文件后,函数将该文件信息放入此结构体中。

  • 函数_findclose()

    • 函数原型: int _findclose( long handle );
    • 返回值:成功返回0,失败返回-1。
    • 参数:handle :_findfirst函数返回回来的句柄。
  • 整个过程:先用_findfirst查找第一个文件,若成功则用返回的句柄调用_findnext函数查找其他的文件,当查找完毕后用,用_findclose函数结束查找。

  • 代码:

#include <>
#include <>

const char *to_search="C:\\WINDOWS\\*.exe";        //欲查找的文件,支持通配符

int main()
    long handle;  //用于查找的句柄
    struct _finddata_t fileinfo; //文件信息的结构体
    handle=_findfirst(to_search,&fileinfo); //第一次查找
    if(-1==handle) return -1;
    printf("%s\n",); //打印出找到的文件的文件名
   while(!_findnext(handle,&fileinfo)) //循环查找其他符合的文件,知道找不到其他的为止
   {
        printf("%s\n",);
   }
   _findclose(handle); //别忘了关闭句柄
   system("pause");
   return 0;
}

 

  • 对目录中的所有文件以及子目录进行搜索(采用递归)
vector<string> files;  

获取该路径下的所有文件  
getFiles(filePath, files );  
 
char str[30];  
int size = ();  
for (int i = 0;i < size;i++)  
{  
   cout<<files[i].c_str()<<endl;  
}  
void getFiles( string path, vector<string>& files )  
{  
   //文件句柄  
   long   hFile   =   0;  
   //文件信息 
   struct _finddata_t fileinfo;  
   string p;  
   if((hFile = _findfirst((path).append("\\*").c_str(),&fileinfo)) !=  -1)  
   {  
      do  
     {  
         //如果是目录,迭代之  
         //如果不是,加入列表  
         if(( &  _A_SUBDIR))  
         {  
             if(strcmp(,".") != 0  &&  strcmp(,"..") != 0)  
                 getFiles( (path).append("\\").append(), files );  
         }  
         else  
         {  
             files.push_back((path).append("\\").append() );  
         }  
     }while(_findnext(hFile, &fileinfo)  == 0);  
      _findclose(hFile);  
    }  
}  

 

2、Linux下获取所有文件操作

  • Linux下遍历目录中的所有文件的相关函数包括opendir()->readdir()->closedir(),位于头文件中。
  • 函数opendir()
    • 函数原型:DIR *opendir(const char *path);
    • 函数返回DIR*,表示打开的目录句柄。
    • 若函数返回NULL,表示打开目录失败。
  • 函数readdir()
    • 函数原型:struct dirent *readdir(DIR *dirp);
    • 函数返回结构体dirent指针。
    • 若返回值为NULL,则获取目录内容失败或目录内容已经全部读取完成。
  • dirent结构体
struct dirent {   
    ino_t  d_ino; //表示存放的该文件的结点数目  
    off_t  d_off; //表示文件在目录中的偏移   
    unsigned short d_reclen; /* length of this record */    
    unsigned char  d_type; //表示文件类型    
    char d_name[256]; //表示文件名字
};
unsigned char d_type,文件或目录的类型。它有可能的取值如下:
    DT_UNKNOWN,未知的类型
    DT_REG,普通文件
    DT_DIR,普通目录
    DT_FIFO,命名管道或FIFO
    DT_SOCK,本地套接口
    DT_CHR,字符设备文件
    DT_BLK,块设备文件

 

  • 函数closedir()

    • 函数原型:int closedir(DIR *dirp);
    • 返回值:0正常 -1错误
  • 操作步骤:

    • 1、打开指定目录opendir得到目录句柄;
    • 2、然后通过while循环不断readdir获取目录的内容,并存储到struct dirent 结构体变量中;
    • 3、获取该结构体变量的成员函数d_name就得到了待扫描的文件,然后在使用sprintf函数加入文件绝对路径,就可以调用API进行扫描了;
    • 4、最后关闭目录句柄closedir
  • 代码:

#include <>
#include <>
#include <sys/>

int main(int argc,char **argv){
    DIR *dirp = NULL;
    struct dirent *dir_entry = NULL;
    char namebuf[100] = {0};
    if((dirp = opendir(argv[1])) == NULL){
        printf("Opendir %s fail!\n",argv[1]);
        return -1;
    }
    while((dir_entry = readdir(dirp)) != NULL){
        sprintf(namebuf,"xxx/xxx/xx/%s",dir_entry->d_name); //这里可以根据实际情况处理,若是需要遍历整个目录,只需要从xxx;                       
        ........
    }
    closedir(dirp);
}

 

参考链接:

/angle_birds/article/details/8503039

/donghanhang/article/details/51106778

/leo_888/article/details/80681184