C++ STL标准库文件目录操作

编译环境:Microsoft visual c++ 6.0

  • 解压”目录.rar”后,用C++ STL编写程序扫描此目录
  • 下载地址:
    链接:https://pan.baidu.com/s/1hi3734qv9dCLvPXh045s5g 
    提取码:53pg 
  • (1)然后输出整个目录结构;

采用的是列表式输出目录结构,这样每个文件都有十分清晰的路径,便于查找。具体方法采用的是io.h头文件下的_findfirst,_findnext等函数和_finddata_t等数据结构。

  • (2)列出所有文件扩展名;

从文件名中提取扩展名,采用的是strrchr函数,并通过两层循环,对重复的扩展名不予显示,使得输出更加简洁清晰。

  • (3)输入扩展名,直接把对应的文件名及其目录,文件大小,打印出来;

通过将输入的扩展名和文件的扩展名进行对比,相同则进行输出,文件大小的输出使用的是filelength和fileno函数,并把最终结果转换为KB进行显示。

  • 加分选项:
  • (4)给出一个文件扩展名和一个文件大小的区间(例如:1KB到10KB)将所有符合条件的 文件名、目录、文件大小、创建和修改日期,打印出来。

先输入文件扩展名,再输入文件上界,然后再输入文件下界,通过查找对比,找出符合条件的所有文件并输出,文件创建和修改时间分别是使用_finddata_t结构下的time_create和time_write成员进行输出,输出过程中需要用到localtime函数转换为本地时间,此函数在time.h头文件下。

程序清单:

#include<iostream>

#include<io.h>

#include<string>

#include<vector>

#include<time.h>

using namespace std;



void FileInfo(string path,vector<string>&file,vector<string>&fname,_finddata_t& filecon)

{

//文件句柄

long myhandle=0;

string p;

//搜索成功,返回0,失败,返回0,则进行下一步

if((myhandle=_findfirst(p.assign(path).append("\\*").c_str(),&filecon))!=-1)

{

do{

//如果是目录,迭代,如果是文件,则显示

if((filecon.attrib&_A_SUBDIR))

{

if(strcmp(filecon.name,".")!=0&&strcmp(filecon.name,"..")!=0)

FileInfo(p.assign(path).append("\\").append(filecon.name),file,fname,filecon);

}

else

{

file.push_back(p.assign(path).append("\\").append(filecon.name));

fname.push_back(strrchr(filecon.name,'.'));



}

}while(_findnext(myhandle,&filecon)==0);

_findclose(myhandle);

}

}

int main()

{

int i,flag=1,max,min;

string findname;

vector<string> file;

vector<string> fname;

//文件信息

_finddata_t filecon;

FileInfo(".\\目录",file,fname,filecon);

//(1)然后输出整个目录结构

cout<<"\n全部扩展名如下:\n";

for(i=0;i<file.size();i++)

cout<<file[i]<<endl;

//(2)列出所有文件扩展名;

cout<<"\n全部文件如下:\n";

for(i=0;i<file.size();i++)

{

for(int j=0;j<i;j++)

if(fname[j]==fname[i])

flag=0;

if(flag)

cout<<fname[i]<<" ";

flag=1;

}

cout<<endl;

//(3)输入扩展名,直接把对应的文件名及其目录,文件大小,打印出来

cout<<"\n请输入扩展名:\n";

cin>>findname;

cout<<"\n扩展名为"<<findname<<"文件如下:\n";

for(i=0;i<file.size();i++)

if(findname==fname[i])

{

cout<<file[i]<<" ";

string filepath=file[i];

FILE*filesize=fopen(filepath.c_str(),"r");

long intiSize=filelength(fileno(filesize));

fclose(filesize);

cout<<intiSize/1024<<" KB"<<endl;

}

cout<<endl;

//(4)给出一个文件扩展名和一个文件大小的区间(例如:1KB到10KB)将所有符合条件的 文件名、目录、文件大小、创建和修改日期,打印出来。

cout<<"\n请输入扩展名:\n";

cin>>findname;

cout<<"请输入文件大小的上界(单位:KB):\n";

cin>>max;

cout<<"请输入文件大小的下界(单位:KB):\n";

cin>>min;

cout<<"\n扩展名为"<<findname<<"、文件大小区间为["<<min<<","<<max<<"]的文件如下:\n";

for(i=0;i<file.size();i++)

if(findname==fname[i])

{

string filepath=file[i];

FILE*filesize=fopen(filepath.c_str(),"r");

long intiSize=filelength(fileno(filesize));

fclose(filesize);

struct tm *tm_create,*tm_alter;

tm_create = localtime(&filecon.time_create);

tm_alter = localtime(&filecon.time_write);

if((intiSize/1024)>=min&&(intiSize/1024)<=max)

{

cout<<file[i]<<" "<<intiSize/1024<<" KB"<<" ";

printf("创建时间: %d-%d-%d %d:%d:%d ", tm_create->tm_year+1900, tm_create->tm_mon+1, tm_create->tm_mday, tm_create->tm_hour, tm_create->tm_min, tm_create->tm_sec);

printf("修改时间: %d-%d-%d %d:%d:%d\n", tm_alter->tm_year+1900, tm_alter->tm_mon+1, tm_alter->tm_mday, tm_alter->tm_hour, tm_alter->tm_min, tm_alter->tm_sec);

}

}

cout<<endl;

return 0;

}

猜你喜欢

转载自blog.csdn.net/ArthurCaoMH/article/details/88809106