关闭

目录下文件遍历及txt内容获取学习笔记

标签: C++文件名遍历txt读取目录遍历
19581人阅读 评论(0) 收藏 举报
分类:

在大数据时代下,文件操作变得越来越频繁。我在处理图像的过程中往往不是对一副图像处理,而是对大量的图片进行处理,因此我需要经常和图像的路劲打交道,所以遍历某个目录下的文件获取路劲便是家常便饭了。在此记录一下自己经常使用的遍历方法:

如果在网上搜索,获取目录下的文件名,你会发下基本上都是我下面的程序:

void getFiles(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)//如果是目录,迭代之
					getFiles(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);
	}
}
int main() 
{
	fstream file;
	vector<string> files;
	string filepath = "C:\\Users\\century\\Desktop\\txt";
	getFiles(filepath, files);
	int counter = files.size();
	for (int i = 0; i < counter; i++)
	{
		cout << files[i].c_str() << endl;//调试检验是否成功
	}
	return 0;
}
以上程序经过本人验证,在X86下确实没有问题可以运行起来!但是把开发环境换成X64就不行了!

经过摸爬滚打,解决了这样的问题,实现了X86,X64下都可以的程序,代码如下:

//获取目录下文件名 x64
void getFiles(string path, vector<string>& files)
{
	//文件句柄
	intptr_t 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)
					getFiles(p.assign(path).append("\\").append(fileinfo.name), files);
			}
			else
			{
				//		files.push_back(p.assign(path).append("\\").append(fileinfo.name));//保存文件的完整路径
				files.push_back(p.assign(fileinfo.name));//仅保存文件名
			}
		} while (_findnext(hFile, &fileinfo) == 0);
		_findclose(hFile);
	}
}
int main()
{
	fstream file;
	vector<string> files;
	string filepath = "C:\\Users\\zhouchong\\Desktop\\txt";
	getFiles(filepath, files);
	int counter = files.size();
	for (int i = 0; i < counter; i++)
	{
		cout << files[i].c_str() << endl;//调试检验是否成功
	}
	return 0;
}

在<io.h>的头文件中有文件查找的函数和结构体,结构体为struct _finddata_t ,函数为_findfirst、_findnext和_fineclose。
struct _finddata_t ,这个结构体是用来存储文件各种信息的。在VS下peek definition就可以看见里面的结构;
unsigned atrrib:文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。这些都是在<io.h>中的宏定义,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。因为是位表示,通过位或的方式可以实现一个文件的多个属性;操作就像windowAPI那样;
time_t time_create:这里的time_t是一个变量类型(typedef long    __time32_t;),time_create变量是用来存储文件创建时间;
time_t time_access:文件最后一次被访问的时间;
time_t time_write:文件最后一次被修改的时间;
_fsize_t size:文件的大小。根据源文件看这里的_fsize_t是unsigned long 类型;

struct _finddata32_t
{
    unsigned    attrib;
    __time32_t  time_create;    // -1 for FAT file systems
    __time32_t  time_access;    // -1 for FAT file systems
    __time32_t  time_write;
    _fsize_t    size;
    char        name[260];
};

struct _finddata32i64_t
{
    unsigned    attrib;
    __time32_t  time_create;    // -1 for FAT file systems
    __time32_t  time_access;    // -1 for FAT file systems
    __time32_t  time_write;
    __int64     size;
    char        name[260];
};

struct _finddata64i32_t
{
    unsigned    attrib;
    __time64_t  time_create;    // -1 for FAT file systems
    __time64_t  time_access;    // -1 for FAT file systems
    __time64_t  time_write;
    _fsize_t    size;
    char        name[260];
};

struct __finddata64_t
{
    unsigned    attrib;
    __time64_t  time_create;    // -1 for FAT file systems
    __time64_t  time_access;    // -1 for FAT file systems
    __time64_t  time_write;
    __int64     size;
    char        name[260];
};
_findfirst函数的源码如下:

_ACRTIMP intptr_t __cdecl _findfirst32i64(
    _In_z_ char const*              _FileName,
    _Out_  struct _finddata32i64_t* _FindData
    );

_Success_(return != -1)
_Check_return_
_ACRTIMP intptr_t __cdecl _findfirst64i32(
    _In_z_ char const*              _FileName,
    _Out_  struct _finddata64i32_t* _FindData
    );

_Success_(return != -1)
_Check_return_
_ACRTIMP intptr_t __cdecl _findfirst64(
    _In_z_ char const*            _FileName,
    _Out_  struct __finddata64_t* _FindData
    );

_Success_(return != -1)
_Check_return_

_findnext函数如下:

_ACRTIMP int __cdecl _findnext64i32(
    _In_  intptr_t                 _FindHandle,
    _Out_ struct _finddata64i32_t* _FindData
    );

_Success_(return != -1)
_Check_return_
_ACRTIMP int __cdecl _findnext64(
    _In_  intptr_t               _FindHandle,
    _Out_ struct __finddata64_t* _FindData
    );

_Check_return_opt_

_findclose函数如下:

Check_return_opt_
_ACRTIMP int __cdecl _findclose(
    _In_ intptr_t _FindHandle
    );

在论坛上经常看见有人为txt的内容提取表示疑惑,我也经常和txt打交道,以防日后遗忘,在此也贴上我常用的一段代码:


//txt 文件内容提取
int CP9()
{
	vector<string>filename;//储存打开txt里面的内容
	ifstream infile("C:\\Users\\zhouchong\\Desktop\\txt\\webtest.txt");
	int i = 0;
	while (!infile.eof())            // 若未到文件结束一直循环 
	{
		string rute;
		getline(infile, rute, '\n');//读取一行,以换行符结束,存入 rute 中
		filename.push_back(rute);
		if (rute == "")
			continue;
		i++;
	}
//检验是否成功
	vector<string>::iterator iter = filename.begin();
	vector<string>::iterator iter2 = filename.end();
	for (int j = 0; j < i; j++)
	{
		string rute;
		//		filename.at(i);
		cout << filename.at(j) << endl;
		//		cout << *iter << endl;
	}
	return 0;
}

   
1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:598472次
    • 积分:2246
    • 等级:
    • 排名:第18399名
    • 原创:22篇
    • 转载:1篇
    • 译文:0篇
    • 评论:8条
    最新评论