题记~
问,把大象关进冰箱总共分几步?
答:分三步:第一步,把冰箱门打开;第二步,把大象装进去;第三步把冰箱门带上。
本文中的方法只能运用在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];
};
首先介绍结构体的成员变量
存储一个unsigned单元,用于表示文件的属性,只要有在<io.h>中定义的宏来表示,如下:
- _A_ARCH (存档)
- _A_HIDDEN (隐藏)
- _A_NORMAL(正常)
- _A_RDONLY (只读)
- _A_SUBDIR (文件夹)
- _A_SYSTEM (系统)
用来存储文件创建的时间,这里的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()函数关闭文件夹。
具体使用方法参考本文中第一部分的代码。
才疏学浅,欢迎指正。