获取某个目录下特定格式文件列表

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;
}


 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值