#include <stdio.h>
#include <windows.h>
#include <time.h>
#include <shlobj.h>
/*
作者:苑文
時間:2007-12-28
e-mail:wenwen227@126.com
調試環境:windows xp + dev-C++
功能:常用Windows api學習實踐
1.檔案夾選擇對話方塊
2.檔案夾遍曆的實現
3.大檔案的顯示方法
簡單介紹:
遍曆指定檔案夾下的所有檔案和檔案夾
沒有選定檔案夾則取當前檔案所在檔案夾
統計最大檔案的路徑,大小
統計最新建立的檔案
*/
void browse(char* strdir);
unsigned int filecount = 0; //檔案數
unsigned int dircount = 0;//目錄數
unsigned int maxsize = 0; //最大檔案
char maxfilepath[MAX_PATH];
char* SelectFolder(char* PathName);
int main(int argc, char *argv[])
{
char filepath[MAX_PATH];
clock_t start, finish;
SelectFolder(filepath);
i = strlen(filepath);
if(0 == i)//選擇框沒有返迴路徑,則取預設路徑
{
strcpy(filepath,argv[0]);
i = strlen(filepath);
for(;filepath[i]!='//';i--);
filepath[i] = '/0';
}
filepath[i]='//';
filepath[i+1]='*';
filepath[i+2]='/0';
start = clock();
browse(filepath);//filepath
finish = clock();
printf("耗時:%dms 檔案數:%d 目錄數:%d/n",finish-start,filecount,dircount,maxsize);
printf("最大檔案路徑:/n%s/n",maxfilepath);
system("PAUSE");
return 0;
}
/*
struct _WIN32_FIND_DATAA {
DWORD dwFileAttributes; 檔案屬性
FILETIME ftCreationTime; 建立時間
FILETIME ftLastAccessTime; 訪問時間
FILETIME ftLastWriteTime; 修改時間
DWORD nFileSizeHigh; 檔案大小 高位元組
DWORD nFileSizeLow; 檔案大小 低位元組
DWORD dwReserved0; 保留
DWORD dwReserved1; 保留
CHAR cFileName[MAX_PATH]; 檔案名稱
CHAR cAlternateFileName[14]; 不知道
}
*/
void browse(char* strdir)
{
WIN32_FIND_DATAA wfd;
HANDLE m_hFle = FindFirstFile(strdir, &wfd);
DWORD errCod = 0;
char fullPath[MAX_PATH];
if (INVALID_HANDLE_VALUE != m_hFle)
{
do
{
strcpy(fullPath,strdir);
fullPath[strlen(fullPath) - strlen("*")] = '/0';//去掉//*
strcat(fullPath,wfd.cFileName);
if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{//目錄
if(wfd.cFileName[0] != '.')
{
strcat(fullPath,"//*");
//printf(fullPath);
browse(fullPath); //遞迴掃描該檔案夾的子檔案
dircount++;
}
}
else//檔案
{
//printf("%s filesize=%d/n",wfd.cFileName,wfd.nFileSizeLow);
filecount++;
if(wfd.nFileSizeLow > maxsize)
{
maxsize = wfd.nFileSizeLow;
sprintf(maxfilepath,"%s",fullPath);
}
}
}while(FindNextFile(m_hFle, &wfd));
}
if (INVALID_HANDLE_VALUE != m_hFle)
{
FindClose(m_hFle);
}
}
char* SelectFolder(char* PathName)
{
BROWSEINFO bi; //控制Browse對話方塊上屬性的結構體
LPITEMIDLIST ItemID;
//char sDir[MAX_PATH]; //MAX_PATH:系統常量,指最大路徑長度
char FolderName[MAX_PATH];
memset(&bi, 0, sizeof(BROWSEINFO)); //清零
PathName[0] = '/0';
//memset(sDir, 0, MAX_PATH);
bi.hwndOwner = NULL; //父視窗控制代碼
bi.pszDisplayName = FolderName; //存放路徑的緩衝區
bi.lpszTitle = "你好嗎?"; //對話方塊標題
bi.ulFlags = BIF_RETURNONLYFSDIRS; //只顯示檔案系統檔案夾
ItemID = SHBrowseForFolder(&bi);
if(ItemID==NULL)
return PathName;
SHGetPathFromIDList(ItemID, PathName);
return PathName;
}