獲取某個目錄下特定格式文件列表

1. 有時爲了獲取某個目錄下特定後綴名文件,是非常有必要的,下面是提取指定後綴的代碼

 

//以下代碼支持windows平臺,其它平臺如mac後續增加

 

//file_filtor.h

 

#ifndef FILE_FILTOR_H
#define	FILE_FILTOR_H

#ifdef	__cplusplus
extern "C" {
#endif

typedef  struct TargetFile TargetFile;
struct TargetFile
{
  char* path;
  TargetFile* next;
  TargetFile* previous;
};

TargetFile *GetFileFromDir(const char *dir, const char *postfix);

void DelTargetFileList(TargetFile *target);

#ifdef	__cplusplus
}
#endif

#endif	/* FILE_FILTOR_H */


//file_filtor.cpp

#include <dirent.h>
#include <iostream>
#include <stdlib.h>
#include <string.h>
#include <string>
#include "file_filtor.h"

TargetFile *GetFileFromDir(const char *path, const char *postfix)
{
    DIR *dir = NULL;
    dir = opendir(path);

    if (!dir)
    {
        return NULL;
    }

    std::string str_file_dir = path;
    if (str_file_dir[str_file_dir.size()-1] != '/')
    {
        str_file_dir.append("/");
    }

    TargetFile *head = (TargetFile *)malloc(sizeof(TargetFile));
    memset(head, 0, sizeof(TargetFile));

    TargetFile *last_file = head;
    while(-1 != dir->dd_stat)
    {
        dirent *file_dir;
        file_dir = readdir(dir);
        if (!file_dir || (!strcmp(file_dir->d_name, ".")) || (!strcmp(file_dir->d_name, "..")))
        {
            continue;
        }

        if (_A_SUBDIR == dir->dd_dta.attrib)
        {
            //是目錄就繼續循環
            continue;
        }

        //獲取後綴
        std::string str_postfix = file_dir->d_name;
        std::string::size_type pos = str_postfix.find_last_of(".");
        if (std::string::npos == pos)
        {
            continue;
        }
        str_postfix = str_postfix.substr(pos);
        if (str_postfix != postfix)
        {
            continue;
        }

        TargetFile *cur_file = (TargetFile *)malloc(sizeof(TargetFile));
        memset(cur_file, 0, sizeof(TargetFile));
        
        std::string str_file_path = str_file_dir + file_dir->d_name;
        cur_file->path = (char *)malloc(str_file_path.size() + 1);
        strcpy(cur_file->path, str_file_path.c_str());
        cur_file->path[str_file_path.size()] = '\0';
        
        cur_file->previous = last_file;
        last_file->next = cur_file;
        last_file = cur_file;
    }  //end while
    closedir(dir);

    //去除head結點
    TargetFile *ret = head->next;
    ret->previous = NULL;
    free(head);

    return ret;
}

void DelTargetFileList(TargetFile *target)
{
    if (!target)
    {
        return ;
    }

    TargetFile *next = target;
    while (next)
    {
        TargetFile *cur = next;
        next = next->next;
        if (cur->path)
        {
            free(cur->path);
        }
    }
}

 

//例子

//main.cpp

/*
 * Simple C++ Test Suite
 */
#include "file_filtor.h"

int main(int argc, char** argv) {

    TargetFile *ret = GetFileFromDir("D:/Users/Desktop/resource/pdf", ".pdf");
    TargetFile *next = ret;
    while(next)
    {
        std::cout<<next->path<<std::endl;
        next = next->next;
    }

    DelTargetFileList(ret);
    
    return 0;
}


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章