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

来源:互联网 发布:thinkphp数组转字符串 编辑:程序博客网 时间:2024/05/20 17:10

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


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

名为:WIN32_FIND_DATA    必须包含的头文件名称为:#include <windows.h>


百度上的定义

      它意为关于文件的全部属性信息。总计有以下以下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 <string>#include <iostream> #include <WINDOWS.H>  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"<<endl;system("pause");return 0;}//输出当前目录下所有文件的文件名for (int i = 2; i < 7; i++) // 数组前两个元素表示的是当前目录和上级目录 . 和 .. 所以从2开始{cout<<file_list[i]<<endl;} system("pause"); return 0;}


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


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



阅读全文
2 0
原创粉丝点击