C++練筆例子3

來源:互聯網
上載者:User

#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 的應用程式, 寫過類似的方法, 所以還是蠻簡單的.

 

這個程式最大的缺點是佔用記憶體蠻大的, 自己水平有限, 不能進一步最佳化, 慚愧!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.