您的位置:首页 > 运维架构 > Linux

Linux C++ 查看目录下所有文件

2016-11-04 10:33 316 查看

Linux C++ 查看目录下所有文件

简介

最近写程序总会用到频繁的读取目录下所有文件的操作,一直用C++写代码,为什么不封装成一个简单的类呢?然后打包成一个动态库或者静态库那么将会大大的方便代码的重用。于是动手写了下面的代码。能用给大家带来帮助将是我的荣幸,同时也希望大家能够尊重作者的劳动成果,不要随意转载。

主要函数

先简单的介绍一下用到的函数:

lstat 函数:

#include<unistd.h>
#include<sys/type.h>
#include<sys/stat.h>

int lstat(const char* path, struct stat *buf);


本函数传入path路径,然后将路径的信息传递给struct stat结构的buf结构中。这里也用到了几个宏定义,S_ISDIR ,S_ISREG分别判断是否是路径,是否是文件。

opendir

 #include<sys/types.h>
 #include<dirent.h>
 DIR* opendir (const char * path );


打开一个目录并且建立以一个目录流,成功返回指向DIR结构的指针,用来读取目录项的数据。

readdir

 #include<sys/types.h>
 #include<dirent.h>
 struct dirent * readdir(DIR *dir)


返回一个指针,指向和目录流dir有关的资源

closedir

 #include<sys/types.h>
 #include<dirent.h>
 int closedir(DIR *dir)


关闭目录流并且释放与之相关的资源。执行成功返回0,失败返回-1。

具体代码

具体代码如下:

/*****************************************************
* author :wyj
* date:  20161104
* finction: list all file and save
* ***************************************************/
#include <iostream>
#include <string>
#include <vector>
#include <sys/stat.h>
#include <sys/types.h>
#include <dirent.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>

using namespace std;

class directory{
public:
directory(string a);
directory(string a, vector<string> &b);
string getInputDir();
void setDir(string a);
vector<string> getFileNameSet();
void getFileName(string inputDir);

private:
string inputDir;
vector<string> fileNameSet;
};

directory::directory(string a)
{
this->inputDir = a;
}

directory::directory(string a, vector<string> &b)
{
this->inputDir = a;
this->fileNameSet = b;
}

string directory::getInputDir()
{
return this->inputDir;
}

void directory::setDir(string a)
{
inputDir = a;
}

vector<string> directory::getFileNameSet()
{
return this->fileNameSet;
}
void directory::getFileName(string inputDir)
{
if(inputDir.empty())
{
return;
}
struct stat statBuf;
mode_t modes;
lstat(inputDir.c_str(), &statBuf);
modes = statBuf.st_mode;
if(S_ISREG(modes))
{
fileNameSet.push_back(inputDir);
return;
}
if(S_ISDIR(modes))
{
struct dirent *dir;
DIR *dp;
if((dp = opendir(inputDir.c_str())) == NULL)
{
cerr<<"open directory error";
return;
}
while((dir = readdir(dp)) != NULL)
{
if(strcmp(".", dir->d_name) ==0 || strcmp("..", dir->d_name) == 0)
{
continue;
}
string subFileName = inputDir + "/" + dir->d_name;
lstat(subFileName.c_str(), &statBuf);
if(S_ISREG(statBuf.st_mode))
{
fileNameSet.push_back(subFileName);
}
if(S_ISDIR(statBuf.st_mode))
{
getFileName(subFileName);
}
}
closedir(dp);
}
}

void usage()
{
cout<<"*********************************************"<<endl;
cout<<"OS : ubuntu 14.04"<<endl;
cout<<"run environment: gcc , C++11"<<endl
cout<<"./recurDirectory filePath"<<endl;
cout<<"*********************************************"<<endl;
}

int main(int argc, char **argv)
{
if(argc != 2)
{
usage();
return 1;
}

string filePath = argv[1];
directory mydir(filePath);
vector<string> tmp;
mydir.getFileName(filePath);
tmp = mydir.getFileNameSet();
//simple  c++ 11 new feature
for(const auto a : tmp)
{
cout<<a<<endl;
}
return 0;
}


测试结果

wyj@k801:~/code/recurDirectory$ ./recurDirectory .
./recurDirectory.cpp
./.recurDirectory.cpp.swp
./makefile
./recurDirectory
./recurDirectory.o


wyj@k801:~/code/recurDirectory$ ./recurDirectory ~ | wc -l
185422


程序有出现Bug的地方,请留言指出错误。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux