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

标签: C++ 文件名遍历 txt读取 目录遍历
19712人阅读 评论(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;
}

            
查看评论

ruby遍历文件夹下所有文件,输出文件名(migrate报错处理)

1.例子: //注释:file_path文件路径 def traverse_dir(file_path) if File.directory? file_path Di...
  • baidu_26981565
  • baidu_26981565
  • 2016-02-01 15:35:54
  • 318

PowerShell获取指定目录下文件列表和大小并保存成txt文档

#列出filepath下所有子文件夹并统计子文件夹大小 function filesize ([string]$filepath) { if ($filepath -eq $null) ...
  • u013252072
  • u013252072
  • 2016-12-20 13:49:56
  • 1945

Fat32递归遍历文件夹下的所有文件

fat32递归遍历文件
  • fuxiaowen1
  • fuxiaowen1
  • 2016-08-23 16:53:16
  • 366

python读取一个目录下所有txt里面的内容

import os allFileNum = 0 def printPath(level, path): global allFileNum ''''' 打印一个目录下的所有文...
  • m0_37694116
  • m0_37694116
  • 2017-06-10 11:20:46
  • 1882

python读取一个目录下的文件,并且写入.txt文件中

代码在python2.7下测试通过 首先在c文件下有3个.txt文件,现在把c文件夹下的所有文件写入到一个.txt文件中,代码如下 # coding=utf-8 import glob def t...
  • momaojia
  • momaojia
  • 2017-05-13 12:11:02
  • 2329

python列出目录下所有的文件到txt

代码: (使用os.listdir)  import os def ListFilesToTxt(dir,file,wildcard,recursion): exts = wild...
  • Huilaojia123
  • Huilaojia123
  • 2016-12-29 14:11:15
  • 645

VC下遍历文件夹的两种方法

想找个能遍历文件夹的办法,找了下,大概有两种,列举如下 第一种方法就是网上常见的一种方法: [cpp] view plain copy find(ch...
  • qq_23992597
  • qq_23992597
  • 2016-06-27 17:29:05
  • 904

用C遍历文件夹下的所有文件

http://hi.baidu.com/xiakeyou/blog/item/7e605601227f3506728da5bd.html #include #include ...
  • oMingZi12345678
  • oMingZi12345678
  • 2014-03-22 18:26:40
  • 2032

C#获取目录及子目录文件名,文件流写入txt

最近工作中需要大批量将文件中的名字录入到Excel 借用写程序减少重复的人工..特此分享 /// /// 点击事件激活选择文件夹 /// ...
  • sinat_35416456
  • sinat_35416456
  • 2017-06-14 16:29:11
  • 171

C++文件遍历,用于遍历一个文件下的所有子目录及文件

  • 2010年03月18日 10:16
  • 1.33MB
  • 下载
    个人资料
    持之以恒
    等级:
    访问量: 79万+
    积分: 3746
    排名: 1万+
    最新评论