#include <iostream>
#include <io.h>
#include <string>
/*
作者: lin49940
日期: 2010.5.1
*/
using namespace std;
/*
* 查询指定的目录下的文件和文件夹, 返回其数目,
* 文件和文件夹信息保存在指针pfile 指向的_finddata_t 数组中
* 参数: dirPath 指定目录;
* 参数: pfile 指针, 指向外部的_finddata_t数组.
* 返回: 如果有文件或文件夹, 返回其数量; 否则返回 -1;
*/
int list(const string dirPath, _finddata_t * pfile, int limit)
{
_finddata_t file;
long h_handle;
if ( (h_handle=_findfirst(dirPath.c_str(),&file))==-1L){
return -1;
}
int index = 0;
while ( _findnext( h_handle, &file ) >= 0 && index < limit){//如果找到下个文件的名字成功的话就返回0,否则返回-1
if(file.name[0] == '.') //出现文件名为两个点的情况 .. , 排除
continue;
*(pfile+index) = file;
//cout << file.name <<endl;
++ index;
}
_findclose(h_handle);
return index;
}
/*
* 判断file 是否文件夹
* 参数: file _finddata_t对象
* 返回: 如果 file 的 attrib 为 _A_SUBDIR, 返回 true; 否则返回 false;
*/
bool isDir(const _finddata_t &file)
{
return (file.attrib == _A_SUBDIR);
}
/*
* 判断file 是否文件
* 参数: file _finddata_t对象
* 返回: 这是把所有非文件夹的认为是文件. 这个有待商议.
*/
bool isFile(const _finddata_t &file)
{
return !isDir(file);
}
/*
* 获取文件的长度
* 参数: file _finddata_t对象
* 返回: 文件的长度, 如果是文件夹, 那将返回 -1
*/
long getFileSize(const _finddata_t &file)
{
return file.size;
}
/*
* 比较传入的文件是否更大
* 参数: path 前置路径, 因为 file.name 没有前面的地址
* 参数: file _finddata_t对象
* 参数: maxSize 引用, 保存最大的大小数目
* 参数: maxSizeStr 引用, 保存最大的文件的路径
* 返回:
*/
void getMaxFile(string path, _finddata_t &file, long &maxSize, string &maxSizeStr)
{
//cout << "maxSize : " << maxSize << endl;
if(file.size > maxSize){
maxSizeStr = path + "/" + file.name;
maxSize = file.size;
}
}
/*
* 检查文件中哪个文件是最大的
* 参数: firstPath 被搜索的目录
* 参数: isNeedDir 是否搜索子目录
* 参数: limit每个目录搜索的文件的最大数目
* 参数: maxSize 引用, 保存最大的大小数目
* 参数: maxSizeStr 引用, 保存最大的文件的路径
* 返回:
*/
void checkSize(string firstPath, bool isNeedDir, int limit, long &maxSize, string &maxSizeStr)
{
cout << "搜索文件夹: " << firstPath << endl;
_finddata_t * pf = new _finddata_t[limit]; //如果不用动态数组, 程序占用的内存会比较多
try{
int index = list(firstPath + "/*.*", pf, limit);
//_finddata_t * pf = file;
for(int i = 0; i < index; ++i){
//cout << (pf + i)-> name << endl;
if(isDir(*(pf + i))){
if(isNeedDir){
checkSize(firstPath + "/" + (pf + i)-> name, isNeedDir, limit, maxSize, maxSizeStr);
}
}else{
cout << (pf + i)-> size << endl;
getMaxFile(firstPath, *(pf + i), maxSize, maxSizeStr);
}
}
}catch(...){
delete []pf;
pf = 0;
throw;
}
delete []pf;
pf = 0;
}
int main()
{
string maxSizeStr; //最大的文件的地址
long maxSize(0); //最大的文件的大小
string firstPath = "D:/TDDOWNLOAD/"; //初始路径
const int MAX_LIMIT = 150; //限制目录下被搜索的文件的数目最大值
checkSize(firstPath, false, MAX_LIMIT, maxSize, maxSizeStr);
cout << maxSizeStr << " " << maxSize << endl;
system("pause");
return 0;
}
遍历文件, 找出最大的文件(虽然可能有多个, 这里没为这种情况作设定).
这里用到了 <io.h>, 虽然只学C++, 不学C, 但是原来c 的一些库还是很好用的呢.
checkSize函数是一个递归函数, 以前写 ftp 的应用程序, 写过类似的方法, 所以还是蛮简单的.
这个程序最大的缺点是占用内存蛮大的, 自己水平有限, 不能进一步优化, 惭愧!