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:centos释放缓存,查看磁盘空间大小,xxx文件夹, 查看文件夹大小,查看剩余内存,查看xxx软件位置,统计某文件夹,统计某文件夹下目录数量,查看文件夹大小,给文件夹下所有的文件赋值权限
- 在linux下用C语言实现递归查看某个目录中的所有文件
- linux-C实现查看目录中所有文件
- linux命令-查看当前目录下所有文件的大小:“ll -h”
- C/C++ 遍历linux目录下所有文件并已树的形式打印
- linux查看目录下所有文件内容中是否包含某个字符串
- 如何查看Linux下面某一个目录下所有的隐藏文件和文件夹
- Linux下 查看当前目录的所有文件
- linux查看目录下所有文件内容中是否包含某个字符串
- C/C++遍历目录下的所有文件(Windows/Linux)
- linux查看rpm包创建的所有目录和文件
- Linux下 C++遍历目录下所有文件
- linux删除一个目录下的所有空文件
- 在Linux环境下轻松更改整个目录下所有目录或者文件属性
- linux下遍历当前目录下的所有文件和目录
- 在linux中怎样用命令完全拷贝一个目录下的所有文件(包括隐藏文件以及文件夹)到另外一个目录下
- Linux查看当前目录下文件的个数
- linux 查看所有进程的文件打开数
- Linux 查看目录大小及文件数量命令
- Linux下检测指定目录下的所有打开的文件(包括子目录)并按照原有的目录结构保存一个副本