背景:
对于给定的目录,获取该目录下面的文件,不包括文件夹。为了方便在没有给定目录文件清单的情况下对该目录下的文件进行操作,增加该需求
方案:
采用readdir进行获取
代码:
string srcDir = ".";
string desDir = "";
vector<string> files;
DIR *dir;
struct dirent *ptr;
dir = opendir(srcDir.c_str()); ///open the dir
while((ptr = readdir(dir)) != NULL) ///read the list of this dir
{
#ifdef _WIN32
printf("d_name: %s\n", ptr->d_name);
#endif
#ifdef __linux
if(ptr->d_type == 8)//只要文件名
printf("d_type:%d d_name: %s\n", ptr->d_type,ptr->d_name);
files.push_back(ptr->d_name);
#endif
}
closedir(dir);
通用版
可以在windows和linux下运行。
#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <string>
#ifdef linux
#include <unistd.h>
#include <dirent.h>
#endif
#ifdef WIN32
#include <direct.h>
#include <io.h>
#endif
#include <vector>
using namespace std;
/**
* @function: 获取cate_dir目录下的所有文件名
* @param: cate_dir - string类型
* @result:vector<string>类型
*/
vector<string> getFiles(string cate_dir)
{
vector<string> files;//存放文件名
#ifdef WIN32
_finddata_t file;
long lf;
//输入文件夹路径
if ((lf=_findfirst(cate_dir.c_str(), &file)) == -1)
{
cout<<cate_dir<<" not found!!!"<<endl;
}
else
{
while(_findnext(lf, &file) == 0)
{
//输出文件名
//cout<<file.name<<endl;
if (strcmp(file.name, ".") == 0 || strcmp(file.name, "..") == 0)
continue;
files.push_back(file.name);
}
}
_findclose(lf);
#endif
#ifdef linux
DIR *dir;
struct dirent *ptr;
char base[1000];
if ((dir=opendir(cate_dir.c_str())) == NULL)
{
perror("Open dir error...");
exit(1);
}
while ((ptr=readdir(dir)) != NULL)
{
if(strcmp(ptr->d_name,".")==0 || strcmp(ptr->d_name,"..")==0) ///current dir OR parrent dir
continue;
else if(ptr->d_type == 8) ///file
//printf("d_name:%s/%s\n",basePath,ptr->d_name);
files.push_back(ptr->d_name);
else if(ptr->d_type == 10) ///link file
//printf("d_name:%s/%s\n",basePath,ptr->d_name);
continue;
else if(ptr->d_type == 4) ///dir
{
files.push_back(ptr->d_name);
/*
memset(base,'\0',sizeof(base));
strcpy(base,basePath);
strcat(base,"/");
strcat(base,ptr->d_nSame);
readFileList(base);
*/
}
}
closedir(dir);
#endif
//排序,按从小到大排序
//sort(files.begin(), files.end());
return files;
}
void main()
{
//char current_address[100];
//memset(current_address, 0, 100);
//getcwd(current_address, 100); //获取当前路径
//cout<<current_address<<endl;
//strcat(current_address, "\\*");
string pp="E:/picture/*";
vector<string>aa = getFiles((string)pp);
for (int i = 0; i<aa.size(); ++i)
{
std::cout << aa[i].c_str()<<std::endl;
}
}