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

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

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

@echo off & setlocal EnableDelayedExpansion

for /f "delims=" %%i in ('"dir /a/s/b/on *.*"') do (

set file=%%~fi

set 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。

猜你喜欢

转载自blog.csdn.net/renjiewen1995/article/details/60574102