C++练笔例子3

#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 的应用程序, 写过类似的方法, 所以还是蛮简单的.

 

这个程序最大的缺点是占用内存蛮大的, 自己水平有限, 不能进一步优化, 惭愧!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值