首页 > 学院 > 开发设计 > 正文

获取指定目录及其子目录下所有文件的绝对路径

2019-11-06 06:48:40
字体:
来源:转载
供稿:网友

获取指定目录及其子目录下所有文件的绝对路径

​ 这个问题困扰了我很久,听说python和java的OS库很容易解决,而在linux下便更容易了。但我常在windows下用C++,对其他语言不太熟悉。刚开始从网上搜了一段批处理指令,将后缀名改为bat,便可以将所有文件路径重定向到指定的文件中,用起来还挺方便。

@echo off & setlocal EnableDelayedExpansionfor /f "delims=" %%i in ('"dir /a/s/b/on *.*"') do (set file=%%~fiset file=!file:/=/!echo !file! >> resPath.txt)

​ 今天得空,搜了一下C++的用法,想来与其他语言也是相似的。源码如下:

//getFilepath.h#include<io.h>#include<string>#include<vector>using namespace std;void getFiles(string path, vector<string>& files);//getFilepath.cpp#include "getFilepath.h"void getFiles(string folderpath, vector<string>& filespath){ //文件句柄 ,文件信息 long hFile = 0; struct _finddata_t *fileinfo = new _finddata_t; string pathPRefix; if ((hFile = _findfirst(pathPrefix.assign(folderpath).append("//*").c_str(), fileinfo)) != -1){ do{ //如果是子目录,递归查找子文件夹 if ((fileinfo->attrib & _A_SUBDIR)){ if (strcmp(fileinfo->name, ".") != 0 && strcmp(fileinfo->name, "..") != 0) getFiles(pathPrefix.assign(folderpath).append("//").append(fileinfo->name), filespath); } //如果是文件,则加入查找结果 else{ filespath.push_back( pathPrefix.assign(folderpath).append("//").append(fileinfo->name)); } } while (_findnext( hFile, fileinfo) == 0); //通过句柄关闭当前目录查找 _findclose(hFile); }}//main.cpp#include "getFilepath.h"#include <iostream>using namespace std;int main(){ char *folderpath = "D://Users//jackren//documents//visual studio 2013//Projects//recFilePath//recFilePath"; vector<string> filepath; //获取该路径下的所有文件 getFiles(folderpath, filepath); int fpsize = filepath.size(); for (int i = 0; i < fpsize; i++) cout << filepath[i].c_str() << endl; system("pause");}

​ 代码中主要用到了io.h头文件中的三个函数和一个结构体,介绍如下:

struct _finddata_t用于存储文件相关信息,在32位编译环境下,定义为以下形式: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 atrrib表示文件属性的存储位置。它存储一个unsigned单元,用于表示文件的属性。文件属性是用位表示的,主要有以下一些:_A_ARCH(存档)、_A_HIDDEN(隐藏)、_A_NORMAL(正常)_A_RDONLY(只读)、_A_SUBDIR(文件夹)、_A_SYSTEM(系统)。

​ 这些都是在 io.h 中定义的宏,可以直接使用,而本身的意义其实是一个无符号整型(只不过这个整型应该是2的几次幂,从而保证只有一位为1,而其他位为0)。既然是位表示,那么当一个文件有多个属性时,它往往是通过位或的方式,来得到几个属性的综合。例如只读+隐藏+系统属性,应该为:_A_HIDDEN | _A_RDONLY |/ _A_SYSTEM 。 name表示文件名,size表示文件大小。

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

返回值:如果查找成功的话,将返回一个long型的唯一的查找用的句柄(就是一个唯一编号)。这个句柄将在_findnext函数中被使用。若失败,则返回-1。

参数:

filespec:标明文件的字符串,可支持通配符。比如:*.c,则表示当前文件夹下的所有后缀为C的文件。

fileinfo :这里就是用来存放文件信息的结构体的指针。这个结构体必须在调用此函数前声明,不过不用初始化,只要分配了内存空间就可以了。函数成功后,函数会把找到的文件的信息放入这个结构体中。

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

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

int _findclose( long handle );

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


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表