c++ 读取文件夹下的所有文件名(实现未知文件名也可以批量读取文件)

批量读取文件,是一个经常用到的方法,但是不知道文件名怎么批量读取呢?


首先,需要知道的就是一个数据结构!

名为:WIN32_FIND_DATA    必须包含的头文件名称为:#include


百度上的定义

      它意为关于文件的全部属性信息。总计有以下以下9种:文件的标题名、文件的属性(只读、存档,隐藏等)、文件的创建时间、文件的最后访问时间、文件的最后修改时间、文件大小的高位双字、文件大小的低位双字、保留、保留。在这里只有文件标题名和文件的长度可以通过CFile类比较方便的获得,而对于其他几种属性的获取和设置就无能为力了。


以下是该数据结构的定义

C++ code

typedef struct _WIN32_FIND_DATA   
{  
   DWORD dwFileAttributes; //文件属性  
   FILETIME ftCreationTime; // 文件创建时间  
   FILETIME ftLastAccessTime; // 文件最后一次访问时间  
   FILETIME ftLastWriteTime; // 文件最后一次修改时间  
   DWORD nFileSizeHigh; // 文件长度高32位  
   DWORD nFileSizeLow; // 文件长度低32位  
   DWORD dwReserved0; // 系统保留  
   DWORD dwReserved1; // 系统保留  
   TCHAR cFileName[ MAX_PATH ]; // 长文件名(最多可达 255 个字符的长文件名),带句点和扩展名  
   TCHAR cAlternateFileName[ 14 ]; //8.3格式文件名(句点前最多有8个字符,而扩展名最多可以有3个字符)  
} WIN32_FIND_DATA, *PWIN32_FIND_DATA;  

可以注意到,其中就有 cFileName 这个属性,表示的是文件名。


FindFirstFile()和 FindNextFile() 函数将文件的属性获取到 WIN32_FIND_DATA 结构对象中去,并返回一个句柄。

以下是该函数的定义

C++ code

HANDLE FindFirstFile(
  LPCTSTR lpFileName,               // 文件路径字符串 或路径的字符指针
  LPWIN32_FIND_DATA lpFindFileData  // 查到的 信息返回到这个指针指向的WIN32_FIND_DATA类型结构体变量中,所以传入了结构体变量的地址,&FindFileData
)

返回值 "查找句柄" 类似 fopen返回的文件句柄,fopen返回文件句柄 后续的文件读写fscanf、fprint利用文件句柄操作,同样 FindFirstFile 返回查找句柄 后续FindFirstFile查找 通过该句柄 操作。


*.*  这个标识符,厉害了~

       不仅在DOS中,在windows下也可以使用,首先要了解文件命名的格式:在windows中,*代表了所有字符,而*.*的意思是windows下的所有文件名和文件格式,比如在C:\123下有几个文件,123.exe 234.jif 345.ppt 564.bat这些文件的文件名和后缀名不同,当我们不知道怎么概括C:\123下面的文件的时候,可以说成“C盘下123文件夹的*.*”,也就是“ C:\*.* ”


上面的知识理解之后,直接上code吧!

#include 
#include  
#include   
using namespace std;

int main(int argc,char *argv[])
{
	string szPath = "E:/test3/*.*";
	WIN32_FIND_DATA wfd;

	HANDLE hFind;//HANDLE句柄
	hFind = FindFirstFile(szPath.c_str(), &wfd);

	//以下表示FindFirstFile调用失败
	if (hFind == INVALID_HANDLE_VALUE)
	{
		cout<<"This Handle is not rightly used";
		return 0;
	}

	if(wfd.cFileName[0] != '.') // 每个文件夹下都有个系统目录"."和"..",点代表当前目录 点点代表上级目录
	{
		return 0;
	}

	char file_list[800][40] = {0};//设置文件名最长 40 个字符,文件个数最多 800 个

	int i = 0;
	do
	{
		strcpy(file_list[i], wfd.cFileName); //存储到数组
		if (++i >= 800) break;
	} while (FindNextFile(hFind, &wfd));
	FindClose(hFind);

	if (file_list[2]) //判断当前目录下是否有文件存在, 若无 ,显示信息并退出程序
	{
		cout<<"No File"<


将当前目录下的所有文件的文件名保存在字符数组之中以后,批量的打开文件也就随心所欲啦!


实现了未知文件名也可以批量读取文件!

c++ 读取文件夹下的所有文件名(实现未知文件名也可以批量读取文件)_第1张图片


你可能感兴趣的:(【想写就写@@】,C++疑难杂症知识点)