linux下循环读取目录文件,linux 遍历目录+文件(优化版本)

#include

#include

#include

#include

#include //linux 精确度s, us gettimeofday()

#include

#include

#include

using namespace std;

//char filename[512];

std::vector vecFilePath;

std::vector vecFilename;

int isDirectory(string fullpath)

{

struct stat st;

int ret = stat(fullpath.c_str(), &st);//return -1, if failed

if(ret==0)//ok

{

if(S_ISDIR( st.st_mode))//是文件目录

{

//cout<

return 1;

}

else if(S_ISREG (st.st_mode) ) //是文件

{

//cout<

return 0;

}

}

return -1;//failed

}

int TraverseDir(string path, bool isNeedFilterFlag, vector vecSuffix,bool isTraveSubDirFlag)

{

DIR *d; //声明一个句柄

struct dirent *file; //readdir函数的返回值就存放在这个结构体中

if(!(d = opendir(path.c_str())))

{

cout<< "error opendir:"<

return -1;

}

while((file = readdir(d)) != NULL)

{

string strFileName(file->d_name);

//隐藏文件.a.txt 隐藏目录.folderA, 没做处理,可以被找到。

//忽略 当前目录. 和上一级目录..

//if(strcmp(file->d_name, ".") == 0 || strcmp(file->d_name, "..") == 0)

if(strFileName.compare(".")==0 || strFileName.compare("..")==0)

{

continue;

}

string fullPath = path + "/" + strFileName;// path+"//"+strFileName; 也OK

int ret = isDirectory(fullPath);

if(ret==0)//是文件

{

if(isNeedFilterFlag==true)//需要过滤

{

bool isNeedSuffix(0);

for(uint32_t i =0; i< vecSuffix.size(); i++)

{

string fileSuffix = fullPath.substr(fullPath.length() - vecSuffix.at(i).length());

bool bMatch = fileSuffix.compare(vecSuffix.at(i))==0;

isNeedSuffix = isNeedSuffix || bMatch;

}

if(isNeedSuffix)

{

vecFilename.push_back(strFileName);

// vecFilename.push_back(fullPath);

}

}

else

{

vecFilename.push_back(strFileName);

}

}

else if(ret==1)//是目录

{

if(isTraveSubDirFlag==true)//如果需要可以继续遍历

{

TraverseDir(fullPath, isNeedFilterFlag, vecSuffix, isTraveSubDirFlag);

}

//continue;

}

else //stat() return -1, failed

{

continue;

}

}

closedir(d);

return 0;

}

int main()

{

string strPath("/home/scott/project"); // /home/scott/project/data

vector vecSuffix;

vecSuffix.push_back(".jpg");

vecSuffix.push_back(".png");

vecSuffix.push_back(".aac");

vecSuffix.push_back(".mp3");

vecSuffix.push_back(".wma");

vecSuffix.push_back(".wave");

vecSuffix.push_back(".mp4");

vecSuffix.push_back(".rmvb");

vecSuffix.push_back(".rmvb");

vecSuffix.push_back(".mov");

vecSuffix.push_back(".flv");

vecSuffix.push_back(".ts");

bool isNeedFilterFlag(true);//过滤文件类型

bool isTraveSubDirFlag(true);//false

struct timeval tvBegin,tvEnd;

struct timezone tz;

gettimeofday (&tvBegin , &tz);

TraverseDir(strPath, isNeedFilterFlag, vecSuffix, isTraveSubDirFlag);

gettimeofday (&tvEnd , &tz);

uint64_t SpendTime = (tvEnd.tv_sec-tvBegin.tv_sec)*1000+(tvEnd.tv_usec-tvBegin.tv_usec)/1000;

std::cout<< "tvBegin.tv_sec ="<

std::cout<< "tvEnd.tv_sec ="<

std::cout<< "SpendTime="<

cout<

/*

for(int i = 0; i < vecFilename.size(); i++)

{

cout<< vecFilename.at(i)<

}*/

return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值