关闭

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

标签: C++文件名遍历txt读取目录遍历
19660人阅读 评论(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网站的观点或立场

Android 读取手机某个文件夹目录及子文件夹中所有的txt文件

1. activity_main.xml文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android1="http://schemas....
  • u012463017
  • u012463017
  • 2015-06-04 12:19
  • 4452

C++11:for_each_file遍历目录处理文件

经常我们需要对某个目录下的所有文件进行处理,这里我们需要列出目录下的文件,并找出符合要求的文件,然后才开始真正的处理工作。大部分情况下,这个流程都差不多,只是文件处理的内容不同,可不可以做一个类似#include<algorithm>中的for_each一样的函数,来把把这个过程抽象化呢...
  • 10km
  • 10km
  • 2016-03-29 14:42
  • 1365

Python递归遍历目录下所有文件

#自定义函数: import os path="D:\\Temp_del\\a" def gci (path): """this is a statement""" parents = os.listdir...
  • gzhouc
  • gzhouc
  • 2016-10-24 21:39
  • 4912

php遍历目录与文件夹的多种方法详解

http://www.jb51.net/article/43186.htm php遍历目录与文件夹的多种方法详解 介绍几个php遍历目录的方法,可以遍历目录及目录中的文件,供大家参考 遍历目录或遍历目录下指定类型的文件,这是每一个童鞋在写程序的时候难免会...
  • wakice
  • wakice
  • 2017-02-20 13:20
  • 452

win32下,遍历目录下的文件和子目录

win32下,遍历目录下的文件和子目录
  • zsy19881226
  • zsy19881226
  • 2016-06-14 14:40
  • 2232

遍历、显示ftp下的文件夹和文件信息

今天做了通过ftp读取ftp根目录下的所有文件夹和文件,嵌套文件夹查询,总共用到了一下代码: 1、FtpFile_Directory  package com.hs.dts.web.ftp; import java.io.IOException; import java.util.Has...
  • cl05300629
  • cl05300629
  • 2013-08-20 15:54
  • 6659

VC下遍历文件夹中的所有文件的几种方法

一、使用::FindFirstFile和::FindNextFile方法 find(char * lpPath) {   char szFind[MAX_PATH];   WIN32_FIND_DATA FindFileData;   strcpy(szFind,lpPath);  ...
  • wllmsdn
  • wllmsdn
  • 2014-05-27 17:38
  • 4555

Java读取txt文件和写入txt文件

原文: Java读取txt文件和写入txt文件写Java程序时经常碰到要读如txt或写入txt文件的情况,但是由于要定义好多变量,经常记不住,每次都要查,特此整理一下,简单易用,方便好懂! package edu.thu.keyword.test; import java.io.Fi...
  • nickwong_
  • nickwong_
  • 2016-05-25 23:16
  • 44324

C/C++遍历文件和目录

C/C++遍历文件夹要用到_finddata_t结构体,函数_findfirst、_findnext和_fineclose,它们都定义在头文件中,下面介绍具体如何使用。   结构体_finddata_t是用来存储文件各种信息的,其中成员变量分别为 Unsigned atrrib:文件...
  • cbbbc
  • cbbbc
  • 2015-01-22 11:07
  • 4152

js获取本地文件夹中文件列表

function init(){ var fso = new ActiveXObject("Scripting.FileSystemObject"); // 获取文件相关信息 var f1 = fso.GetFile("F:\\test\\test.txt&...
  • daxiang12092205
  • daxiang12092205
  • 2014-08-28 21:58
  • 24278
    个人资料
    • 访问:725805次
    • 积分:3057
    • 等级:
    • 排名:第13758名
    • 原创:29篇
    • 转载:1篇
    • 译文:0篇
    • 评论:10条
    最新评论