C++中_finddata_t结构体存储文件信息

最近调试程序的时候需要处理大量txt文件,这里对于处理各种文件的信息做个笔记。

Struct _finddata_t结构体可以用来处理各种文件的文件信息,使用该结构体需要添加头文件io.h。

它的定义如下所示

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 attrib:无符号整形、位表示。它的作用是表示文件的属性,一般来说,文件的属性有如下几种:

_A_ARCH(存档)、 _A_HIDDEN(隐藏)、_A_NORMAL(正常)、_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)

time_t time_create:表示从1970年1月1日0时0分0秒到现在时刻的秒数。

time_t time_access:文件最后一次被访问的时间

time_t time_write:文件最后一次被修改的时间

_fsize_t size:文件的大小。

char name[_MAX_FNAME]:文件的文件名,这里的_MAX_FNAME是一个常量宏,它在头文件中被定义,表示的是文件名的最大长度。

为了使用这个结构体将文件的信息存储到该结构体的内存空间,需要搭配使用_findfirst()、_findnext()、_findclose()三个函数使用。首先用_findfirst函数查找第一个文件,若成功则用返回的句柄,调用_findnext函数查找其他的文件,当查找文件完成之后,就会用_findclose函数结束查找。

long _findfirst( char *filespec, struct _finddata_t *fileinfo );

返回值:如果查找成功,那么就返回一个long型的唯一查找用的句柄。这个句柄会在_findnext函数中被使用。失败的话就会返回0.

参数:filespec:标明文件的字符串。例如:*.c

           fileinfo:这里就是用来存放文件信息的结构体的指针。函数成功后,函数会把找到的文件的信息放入这个结构体所分配的内存空间中。

int _findnext( long handle, struct _finddata_t *fileinfo );

返回值:若成功返回0,否则返回-1。

参数:handle:即由_findfirst函数返回回来的句柄。

int _findclose( long handle );

返回值:成功返回0,失败返回-1。

 

下面介绍一下C++里面的句柄,为了区分句柄和指针。分别介绍一下:

指针:指针通俗来着就是地址,他是内存的编号,通过指针我们可以直接对内存进行操作,只要地址不变,我们每次操作的物理位置是绝对不变的。

句柄:一般是指向系统的资源的位置,可以说也是地址。但是这些资源的位置真的不变,我们都知道window支持虚拟内存的技术,同一时间内可能有些资源被换出内存,一些被换回来,这就是说同一资源在系统的不同时刻,他在内存的物理位置是不确定的,那么window是如何解决这个问题呢,就是通过句柄来处理资源的物理位置不断变化的这个问题的。window会在物理位置固定的区域存储一张对应表,表中记录了所有的资源实时地址,句柄其实没有直接指向资源的物理地址,而是指向了这个对应表中的一项,这样无论资源怎样的换进换出,通过句柄都可以找到他的实时位置。

具体句柄解析:https://www.cnblogs.com/vinsonLu/p/3613453.html

以下为解决工程问题所写的小测试程序:

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

using namespace std;

#define ADDR "C://Users//CiCi//Desktop//8.7//*.txt"
const char *SearchAddr = ADDR;

int main()
{
	long Handle;
	struct _finddata_t FileInfo;
	vector<string>name;
	vector<string>direction;
	vector<string>last_t;
	vector<int>id;
	vector<int>direction_2;
	Handle = _findfirst(SearchAddr, &FileInfo);
	name.push_back(FileInfo.name);
	while (!_findnext(Handle, &FileInfo))
	{
		name.push_back(FileInfo.name);
	}
	for (auto it = name.begin(); it != name.end(); it++)
	{
		/*cout << *it << endl;*/
		string str = *it;
		direction.push_back(str.substr(21, 1));
		last_t.push_back(str.substr(0, 6));
	}
	for (auto it = direction.begin(); it != (direction.end()-3); it = it + 3)
	{
		string a = *it;
		string b = *(it + 3);
		auto c = a.compare(b);
		direction_2.push_back(c);
	}
	for (auto it = last_t.begin(); it !=(last_t.end() - 3); it = it + 3)
	{
		string a = *it;
		string b = *(it + 3);
		auto c = a.compare(b);
		/*cout << c << endl;*/
		id.push_back(c);
	}
	for (auto it = id.begin(); it != id.end(); it++)
	{
		if (direction_2.at(it - id.begin())==  0 && id.at(it - id.begin())==0)
		{
			cout << name.at(3*(it - id.begin())) << endl;
		}
	}
	_findclose(Handle);
	return 0;
}

这里有几个注意的地方:

1.使用_findfirst函数之后,要立刻把文件名存入vector容器中去,不然接下来调用_findnext函数会导致缺少第一个文件。

2.这里使用了string的一个substr函数,函数结构为str.substr(m,n)。其中,str为string型变量的变量名,m为字符串的第m个字符,n为从第m个字符起的个数。

3.比较两个string对象是否相等,这里用compare函数,函数结构为s1.compare(s2),如果两个string对象相等的话,就会返回0;

 

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值