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