您的位置:首页 > 其它

获取某个目录下特定格式文件列表[2]_mac版本

2012-12-19 20:26 357 查看
//下面是mac环境下获取某个目录下特定后缀名文件列表,如果要windows代码请看另外一编文章

////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;
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;
dirent *file_dir = NULL;
while(NULL != (file_dir = readdir(dir)))
{
if (!file_dir || (!strcmp(file_dir->d_name, ".")) || (!strcmp(file_dir->d_name, "..")))
{
continue;
}

if (DT_DIR == file_dir->d_type)
{
//是目录就继续循环
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

#include "file_filtor.h"

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

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

DelTargetFileList(ret);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: