您的位置:首页 > 编程语言 > C语言/C++

C++ 查找获取文件名相关函数和实现(_findfirst;_findnext;_findclose;_finddata_t)

2015-06-16 09:06 513 查看
 最近做一个小项目需要获取某个文件夹下面所有的图片的名称,经过上网查阅资料和相关学习,现在完成了这个功能。在这里与大家分享,也算对知识的复习和梳理。

 首先来看一下几个相关的函数和结构:

(1)_finddata_t结构:

该结构存储后面用到的_findfirst等函数需要用到的文件的信息。

struct _finddata_t

{

unsigned  attrib;            //文件的属性信息,例如_A_ARCH 存档,_A_HIDDEN 隐藏,_A_SUBDIR 文件夹等;完整的查看MSDN介绍。

time_t   time_create;    //文件创建时间

time_t   time_access; //文件最后被访问的时间

time_t  time_write;//文件最后被改写的时间

_fsize_t  size;//文件的大小

char name[MAX_FNAME];   //文件名称

};

(2)_findfirst()函数:

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

参数:filespec 指定一个需要查找的样式,例如 "D:/test/*.png",可以用*来描述所有需要的类型,具体参照下面的demo。

            fileinfo 将匹配的文件信息存入fileinfo中。

函数功能:将第一个与filespec匹配的文件信息存入fileinfo中,主要获取的信息为该结构中的文件名。

返回值:如果成功则返回一个独一无二的搜索句柄来标识这个或这组文件。即一个long 类型的值。这个long值可视为句柄,随后可以用在调用_findnext()函数中。

如果失败则返回-1,并将errno设置成以下等值:ENOENT,EINVAL等。具体查阅MSDN。

(3)_findnext()函数;

long _findnext(long  handle, struct  _finddata_t  *fileinfo)

参数:handle即之前调用_findfirst函数返回的一个long类型的值。

   fileinfo 将下一个匹配的文件信息存入fileinfo中。

函数功能:查找下一个匹配的名字,匹配的格式由_findfirst()中参数指定的,找到的话就更改fileinfo的内容。

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

(4) _findclose()函数:

int  _findclose(long handle)

参数:handle即之前调用_findfirst()返回的long类型的值。

功能:关闭指定搜索句柄,释放相关资源。

返回值:如果成功则返回0;否则返回-1,并设置相关errno的值。

下面的程序完成指定的路径下所有的png的文件名的获取:

#include "stdafx.h"

#include <iostream>

#include <string>

#include <io.h>

#include <vector>

using namespace std;

bool findfilenames(string path, string end, vector<string> &files)

{
long hFile;
string fullname, endname;
struct _finddata_t fileinfo;
endname = "/*." + end;
if ((hFile = _findfirst(fullname.assign(path).append(endname).c_str(), &fileinfo)) != -1)
{
do
{
files.push_back(fullname.assign(path).append("/").append(fileinfo.name));

} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
return true;

}

int main()

{
string path = "E:/GPEditor/in";
string end = "png";
vector<string> myfiles;
bool b = findfilenames(path, end, myfiles);
for (vector<string>::const_iterator it = myfiles.begin(); it != myfiles.end(); it++)
cout << *it << endl;
return 0;

}

改程序还不算完善,仅仅完成简单功能,并没有错误的检查以及子目录的查找等功能。程序中用到一些简单函数assign(),append()等。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息