#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 的應用程式, 寫過類似的方法, 所以還是蠻簡單的.
這個程式最大的缺點是佔用記憶體蠻大的, 自己水平有限, 不能進一步最佳化, 慚愧!