编译环境: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;
}