#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;
}