Linux递归访问文件目录
#include < iostream>
#include < cstring>
#include < cstdlib>
#include <sys/types.h>
#include <dirent.h>
#include <unistd.h>
#include <errno.h>
#include < iomanip>
#include < string>
#include < vector>
#include < fstream>
const int STRING_LEN = 20;
void printDIR(const char* path);
void printDIRRecursive(const char* path);
void printDIR(const char* path){
DIR* pDir = opendir(path);
if(pDir == nullptr){
perror("opendir failed!");
return ;
}
struct dirent* pDirent = nullptr;
while((pDirent = readdir(pDir)) != nullptr){
if(strcmp(pDirent->d_name,".") == 0 || strcmp(pDirent->d_name,"..") == 0)
continue;
std::cout << "["<< std::setw(STRING_LEN) << pDirent->d_name << "] \t----->";
switch(pDirent->d_type){
case DT_BLK:
std::cout << "块设备文件" << std::endl;
break;
case DT_CHR:
std::cout << "字符设备文件" << std::endl;
break;
case DT_DIR:
std::cout << "目录文件" << std::endl;
break;
case DT_FIFO:
std::cout << "管道文件" << std::endl;
break;
case DT_LNK:
std::cout << "链接文件" << std::endl;
break;
case DT_REG:
std::cout << "普通文件" << std::endl;
break;
case DT_SOCK:
std::cout << "socket文件" << std::endl;
break;
case DT_UNKNOWN:
std::cout << "未知文件类型" << std::endl;
break;
}
}
closedir(pDir);
}
void printDIRRecursive(const char* path){
const std::string _path(path);
static int depth = 0;
DIR* pDir = opendir(_path.c_str());
if(pDir == nullptr){
perror("opendir failed!");
return ;
}
struct dirent* pDirent = nullptr;
while((pDirent = readdir(pDir)) != nullptr){
std::string name;
for(int i = 0;i < depth;i++)
name += "\t";
name += ("[");
name += pDirent->d_name;
name += "]";
if(strcmp(pDirent->d_name,".") == 0 || strcmp(pDirent->d_name,"..") == 0)
continue;
switch(pDirent->d_type){
case DT_BLK:
std::cout << name << ":块设备文件" << std::endl;
break;
case DT_CHR:
std::cout << name << ":字符设备文件" << std::endl;
break;
case DT_DIR:
std::cout << name << ":目录文件" << std::endl;
name = _path;
name += "/";
name += pDirent->d_name;
depth++;
printDIRRecursive(name.c_str());
break;
case DT_FIFO:
std::cout << name << ":管道文件" << std::endl;
break;
case DT_LNK:
std::cout << name << ":链接文件" << std::endl;
break;
case DT_REG:
std::cout << name << ":普通文件" << std::endl;
break;
case DT_SOCK:
std::cout << name << ":socket文件" << std::endl;
break;
case DT_UNKNOWN:
std::cout << name << ":未知文件类型" << std::endl;
break;
}
}
closedir(pDir);
depth--;
}
void printDIRRecursive(const char* path,std::vectorstd::string& path_vec){
const std::string _path(path);
static int depth = 0;
DIR* pDir = opendir(_path.c_str());
if(pDir == nullptr){
perror("opendir failed!");
return ;
}
struct dirent* pDirent = nullptr;
while((pDirent = readdir(pDir)) != nullptr){
std::string name;
for(int i = 0;i < depth;i++)
name += "\t";
name += ("[");
name += pDirent->d_name;
name += "]";
if(strcmp(pDirent->d_name,".") == 0 || strcmp(pDirent->d_name,"..") == 0)
continue;
switch(pDirent->d_type){
case DT_BLK:
name += ":块设备文件";
path_vec.push_back(name);
break;
case DT_CHR:
name += ":字符设备文件";
path_vec.push_back(name);
break;
case DT_DIR:
name += ":目录文件";
path_vec.push_back(name);
name = _path;
name += "/";
name += pDirent->d_name;
depth++;
printDIRRecursive(name.c_str(),path_vec);
break;
case DT_FIFO:
name += ":管道文件";
path_vec.push_back(name);
break;
case DT_LNK:
name += ":链接文件";
path_vec.push_back(name);
break;
case DT_REG:
name += ":普通文件";
path_vec.push_back(name);
break;
case DT_SOCK:
name += ":socket文件";
path_vec.push_back(name);
break;
case DT_UNKNOWN:
name += ":未知文件类型";
path_vec.push_back(name);
break;
}
}
closedir(pDir);
depth--;
}
int main(int argc,char* argv[]){
for(int i = 0;i < argc;i++)
std::cout << i <<": " << argv[i] << std::endl;
printDIR(argv[1]);
std::cout << std::endl;
printDIRRecursive(argv[1]);
std::vector<std::string> path;
printDIRRecursive(argv[1],path);
std::ofstream out("dir_path.txt");
for(std::string path_name: path)
out << path_name << std::endl;
return 0;
}
图片:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)