C++实现读取特定路径下文件夹及文件名的方法

时间:2022-01-08 23:40:36

本文所述实例代码主要实现读取给定路径下的所有文件夹名称或所有带后缀的文件名的功能。具体解决方法如下:
 
主要用到了以下几个头文件(类):io.h, fstream, string。
 
首先,读取某给定路径下所有文件夹与文件名称,并带完整路径。实现代码如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
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) );
          getFilesall( p.assign(path).append("\\").append(fileinfo.name), files );
        }
      }
      else
      {
        files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
      }
    }while(_findnext(hFile, &fileinfo) == 0);
    _findclose(hFile);
  }
}

该函数有两个参数,第一个为路径字符串(string类型,最好为绝对路径);第二个参数为文件夹与文件名称存储变量(vector类型,引用传递)。
在主函数中调用格式(并将结果保存在文件"AllFiles.txt"中,第一行为总数):

?
1
2
3
4
5
6
7
8
9
10
11
12
char * filePath = "E:\\YunShi";
vector<string> files;
char * distAll = "AllFiles.txt";
getFilesall(filePath, files);
ofstream ofn(distAll);
int size = files.size();
ofn<<size<<endl;
for (int i = 0;i<size;i++)
{
  ofn<<files[i]<<endl;
}
ofn.close();

同理,只读取某给定路径下的当前文件夹名(以下类似,只给出函数,调用案例同上):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void getJustCurrentDir( 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(fileinfo.name);
           //files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
         }
           
       
     }while(_findnext(hFile, &fileinfo) == 0);
     _findclose(hFile);
   }
 }

只读取某给定路径下的当前文件名:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void getJustCurrentFile( 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))
      {
        ;
      }
      else
      {
        files.push_back(fileinfo.name);
        //files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
      
    }while(_findnext(hFile, &fileinfo) == 0);
    _findclose(hFile);
  }
}

只读取某给定路径下的所有文件名(即包含当前目录及子目录的文件):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
void getFilesAll( 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) );
           getFilesA( p.assign(path).append("\\").append(fileinfo.name), files );
         }
       }
       else
       {
         files.push_back(p.assign(path).append("\\").append(fileinfo.name) );
       }
     }while(_findnext(hFile, &fileinfo) == 0);
     _findclose(hFile);
   }
 }