C++ 存储指定文件夹下的文件

简介:   指定文件夹地址,然后读取文件夹内容。   file.h#include <string>#include <vector>#include <io.h>/** 定义于io.h* 1、long _findfirst64i32(const char * _Filename,struct _finddata64i32_t * _FindDa

  指定文件夹地址,然后读取文件夹内容。

  file.h

#include <string>
#include <vector>
#include <io.h>

/*
* 定义于io.h
* 1、long _findfirst64i32(const char * _Filename,struct _finddata64i32_t * _FindData);
* 查找第一个_Filename的信息,存储到结构体_FindData中 
* 查找成功,返回一个用于继续查找的句柄(一个唯一的编号)
* 查找 失败,返回-1           
* 
* 2、int _findnext64i32(long handle,struct _finddata64i32_t *fileinfo) ; 
* 根据句柄handle查找下一个文件,存放在 fileinfo中
* 查找成功,返回0
* 失败返回-1
* 
* 3、ing _findclose(long handle);
* 关闭句柄handle
* 成功返回0,
* 失败返回-1
*
* 4、struct _finddata64i32_t
* 用来存储文件的各种信息
* 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];
*	};
* unsigned attrib  :4个字节,存储文件的属性
*	_A_ARCH  (存档) 0x20 
*	_A_SUBDIR(文件夹)0x10
*  _A_SYSTEM(系统)0x04
*	_A_HIDDEN(隐藏)0x02
*	_A_RDONLY(只读)0x01
*	_A_NORMAL(正常)0X00
*  以上均是宏,unsigned int,各属性叠加时进行或运算,如_A_HIDDEN|_A_RDONLY
*
*__time64_t  time_create:  文件创建的时间
*__time64_t  time_access:  文件最后一次访问的时间
*__time64_t  time_write:   文件最后以此修改的时间
*_fsize_t    size:         文件的大小,字节为单位
*char        name[260]:    文件名
*/

enum TKFileInfo
{
	FILE_EMPTY = -1,	// 目录为空
	FILE_SUCCESS,		// 查找成功
};

struct fileInfoNode
{
	struct _finddata64i32_t fileInfo;
	std::string fileName;
	struct fileInfoNode* left;
};

typedef std::vector<std::string> VEC_PATH;

class CTKFile
{
public:
	CTKFile();
	~CTKFile();

public:
	int  SearchAllFile(std::string filePath,
		int layer,
		VEC_PATH& vecPath); 

private:
	int  SaveToLink(struct fileInfoNode*& head,			
				   const std::string& fileName,
				   const struct _finddata64i32_t& fileInfo);
	void SaveLinkToFile(struct fileInfoNode* head,
					   std::vector<std::string>& vecPath,
					   int counter);
};

file.cpp

#include "TKFile.h"

CTKFile::CTKFile()
{

}

CTKFile::~CTKFile()
{

}

int CTKFile::SaveToLink(struct fileInfoNode*& head, 
						const std::string& fileName, 
						const struct _finddata64i32_t& fileInfo)
{
	fileInfoNode* p;
	p = new fileInfoNode;
	p->fileInfo = fileInfo;
	p->fileName = fileName;
	p->left = head;
	head = p;
	return 0;
}

void CTKFile::SaveLinkToFile(struct fileInfoNode* head, 
							 std::vector<std::string>& vecPath,
							 int counter)
{
	vecPath.clear();
	if (vecPath.capacity() < counter)
	{
		vecPath.reserve(counter);
	}

	while (head != NULL)
	{
		vecPath.push_back(head->fileName);
		head = head->left;
	}
}

int CTKFile::SearchAllFile(std::string filePath, 
						   int layer, 
						   VEC_PATH& vecPath)
{
	struct _finddata64i32_t fileInfo;	// 保存文件信息的结构体
	static fileInfoNode* head = NULL;
	static int counter = 0;				// 记录文件数目
	long handle;						// 句柄
	int done;							// 查找nextfile是否成功
	std::string fileName = filePath + "/*.*"; // 要搜索的文件名

	// 查找第一个文件
	handle = _findfirst64i32(fileName.c_str(), &fileInfo);
	if (handle == -1)
	{
		return -1;
	}

	do 
	{
		// 如果是文件夹"."或者"..",则进行判断下一个文件
		if ((strcmp(fileInfo.name, ".") == 0) | (strcmp(fileInfo.name, "..") == 0))
		{
			continue;
		}
		// 如果是文件夹,则进入下一层文件夹搜索
		if ((fileInfo.attrib & _A_SUBDIR) == _A_SUBDIR)
		{
			std::string filePathSub = filePath + "/" + fileInfo.name;
			SearchAllFile(filePathSub, ++layer, vecPath);
			--layer;
		}
		else
		{
			++counter;
			std::string fileNameTure = filePath + "/" + fileInfo.name;
			SaveToLink(head, fileNameTure, fileInfo);
		}
	} while (!(done = _findnext64i32(handle, &fileInfo)));
	_findclose(handle);
	if (layer == 0)
	{
		SaveLinkToFile(head, vecPath, counter);
	}
	return 0;
}



相关文章
|
6月前
|
存储 编译器 程序员
c++存储类
c++存储类
56 3
|
1月前
|
Linux C++
Linux c/c++文件的基本操作
在Linux环境下使用C/C++进行文件的基本操作,包括文件的创建、写入、读取、关闭以及文件描述符的定位。
19 0
Linux c/c++文件的基本操作
|
5月前
|
存储 分布式数据库 API
技术好文:VisualC++查看文件被哪个进程占用
技术好文:VisualC++查看文件被哪个进程占用
|
2月前
|
C++ 内存技术
[转]Visual C++内嵌swf文件并播放
[转]Visual C++内嵌swf文件并播放
|
1月前
|
Linux C++
Linux c/c++文件虚拟内存映射
这篇文章介绍了在Linux环境下,如何使用虚拟内存映射技术来提高文件读写的速度,并通过C/C++代码示例展示了文件映射的整个流程。
47 0
|
1月前
|
Linux C++
Linux c/c++文件移动
这篇文章介绍了在Linux环境下,使用C/C++语言通过命令方式和文件操作方式实现文件移动的方法。
70 0
|
2月前
|
Linux API C++
超级好用的C++实用库之文件目录操作
超级好用的C++实用库之文件目录操作
32 0
|
2月前
|
JavaScript 前端开发 测试技术
一个google Test文件C++语言案例
这篇文章我们来介绍一下真正的C++语言如何用GTest来实现单元测试。
20 0
|
3月前
|
存储 算法 C++
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
【C++】C++ QT实现Huffman编码器与解码器(源码+课程论文+文件)【独一无二】
|
3月前
|
存储 数据挖掘 C语言
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】
【C/C++】C/C++车辆交通违章管理系统(源码+数据文件)【独一无二】