C/C++读取文件名(Windows)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lsq2902101015/article/details/46551311

题记~

问,把大象关进冰箱总共分几步?

答:分三步:第一步,把冰箱门打开;第二步,把大象装进去;第三步把冰箱门带上。


本文中的方法只能运用在Windows系统。


一、代码


获取文件名也是如此,打开文件夹,将文件夹里的文件名读入内存,最后关闭文件夹好啦,废话不多说,先上代码


//代码功能:获取指定文件夹里的文件名并写入到文本文件中
-----------------【程序所依赖头文件】-------------------
#include<io.h>           //读取文件名要包含的头文件 
#include<iostream>
#include<stdlib.h>
#include<vector>
#include<fstream>
//---------------------------------------------------------

//---------------【程序所使用的命名空间】--------------
using namespace std;
//---------------------------------------------------------

//---------------------【全局函数声明】-----------------
void GetFileName(string path, vector<string>& files);
//--------------------------------------------------------

//--------------------【main()函数】--------------------
int main()
{
      char *path = "E:\\exemple";                         //指定文件目录
      vector<string> filesName;
      ofstream file_out("filename.txt");                //打开文本文件
      GetFileName(path, filesName);                   //获取文件名
	
      for(size_t i = 0 ; i<filesName.size(); i ++)            //将文件名写入到文本中
       {	
	   file_out<<filesName[i].c_str()<<endl;	
        }
      file_out.close();     //关闭文本文件

      return 0; 
}

void GetFileName(string path, vector<string>& filesName)
{
     
    long   hFile   =   0;                    //文件句柄 
    struct _finddata_t fileinfo;        //定义文件信息结构体
    string p;  
    if((hFile = _findfirst(p.assign(path).append("\\*").c_str(),&fileinfo)) !=  -1) //使用函数_findfirst()打开文件并获取第一个文件名
    {  
        do  
        {       
           if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  //"."表示当前目录,".."表示父目录
               filesName.push_back(fileinfo.name);  
        }while(_findnext(hFile, &fileinfo)  == 0);      //使用函数_findnext()继续获取其他文件名
        _findclose(hFile);              //使用函数_findclose()关闭文件夹
    }
}

上述代码中GetFileName()函数的功能是获取指定文件夹中所有文件的名字,不管文件是什么类型。


如果想要获取某种文件类型的所有文件名,比如.txt,可将GetFileName()函数做如下修改:

void GetFileName(string path, vector<string>& filesName)
{
	//文件句柄  
    long   hFile   =   0;  
    //文件信息  
    struct _finddata_t fileinfo;  
    string p;  
   // if((hFile = _findfirst(p.assign(path).append("\\*").c_str(), &fileinfo)) !=  -1)  
    if((hFile = _findfirst(p.assign(path).append("\\*.txt").c_str(), &fileinfo)) !=  -1)    //添加文件格式后缀
    {  
        do  
        {       
           if(strcmp(fileinfo.name,".") != 0  &&  strcmp(fileinfo.name,"..") != 0)  
               filesName.push_back(fileinfo.name);  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }
}

如要获取指定文件夹中所有文件名,包括子文件中的所有文件名,修改GetFileName()函数如下:


void GetFileName(string path, vector<string>& filesName)
{
    //文件句柄  
    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) 
		   GetFileName(p.assign(path).append("\\").append(fileinfo.name), filesName);
	    }
	   else
              filesName.push_back(fileinfo.name);  		  
        }while(_findnext(hFile, &fileinfo)  == 0);  
        _findclose(hFile);  
    }
}


二、使用 _finddata_t 结构体


由上面的代码,我们看到,获取文件名由结构体_finddata_t和函数_findfirst()_findnext()_findclose()来完成,其均被包含在<io.h>头文件中。

下面慢慢来讲解他们的用法。


1、_finddata_t 结构体


_finddata_t 结构体定义如下:

struct _finddata_t
        {
             unsigned attrib;
             time_t time_create;
             time_t time_access;
             time_t time_write;
             _fsize_t size;
             char name[_MAX_FNAME];
        };


首先介绍结构体的成员变量


(1)unsigned attrib 

存储一个unsigned单元,用于表示文件的属性,只要有在<io.h>中定义的宏来表示,如下:

  • _A_ARCH      (存档)
  • _A_HIDDEN  (隐藏)
  • _A_NORMAL(正常)
  • _A_RDONLY (只读)
  • _A_SUBDIR  (文件夹)
  • _A_SYSTEM  (系统)

(2)time_t time_create

用来存储文件创建的时间,这里的time_t是一个变量类型,看一下time_t的定义

type _time64_t time_t;
type _int64 _time64_t;
由此看到,time_create是一个64位的整型。

(3)time_t time_access

文件最后一次被访问的时间。


(4)time_t time_write

文件最后一次被修改的时间。


(5)_fsize_t size

文件的大小。来看一下_fsize_t的定义:

typedef unsigned long _fsize_t; /* Could be 64 bits for Win32 */

所以_fsize_t是无符号型的长整型。


(6)char name[_MAX_FNAME]

文件的文件名。这里_MAX_FNAME是一个常量宏,在头文件<stdlib.h>中被定义:

#define _MAX_FNAME  256 /* max. length of file name component */


表示文件名的最大长度,最大长度为256。


2、_findfirst()、_findnext()和_findclose()函数


定义结构体 _finddata_t 后,使用_findfirst()_findnext()_findclose()三个函数来获取文件名。


三个函数的原型定义:

//根据Filename命名规则匹配当前目录第一个文件
intptr_t  _findfirst64i32(_In_z_ const char * _Filename, _Out_ struct _finddata64i32_t * _FindData);
//根据Filename命名规则匹配当前目录下一个文件
int  _findnext64i32(_In_ intptr_t _FindHandle, _Out_ struct _finddata64i32_t * _FindData);
//关闭_findfirst返回的文件句柄
int  _findclose(_In_ intptr_t _FindHandle);

 
 

获取文件名步骤:

(1)打开文件夹

通过_findfirst()函数打开指定文件夹,找到并返回匹配到第一个文件的句柄。数据类型为long,遍历过程可以指定文件类型,这通过FileName的赋值来实现。

(2)获取文件名

_findnext()函数通过_findfirst()函数返回的句柄获取下一个文件,通过循环调用_findnext()函数,即可获取指定文件中的所有文件名。

(3)关闭文件夹

获取全部文件名后,使用_findclose()函数关闭文件夹。

具体使用方法参考本文中第一部分的代码。



才疏学浅,欢迎指正。

猜你喜欢

转载自blog.csdn.net/lsq2902101015/article/details/46551311
今日推荐