如题所述
/**************************************************
è¿æ¯CBrowseDirçç±»å®ä¹æ件 BrowseDir.h
/**************************************************
#include "stdlib.h"
class CBrowseDir
{
protected:
//åæ¾åå§ç®å½çç»å¯¹è·¯å¾ï¼ä»¥'\'ç»å°¾
char m_szInitDir[_MAX_PATH];
public:
//缺çæé å¨
CBrowseDir();
//设置åå§ç®å½ä¸ºdirï¼å¦æè¿åfalseï¼è¡¨ç¤ºç®å½ä¸å¯ç¨
bool SetInitDir(const char *dir);
//å¼å§éååå§ç®å½åå ¶åç®å½ä¸ç±filespecæå®ç±»åçæ件
//filespecå¯ä»¥ä½¿ç¨éé 符 * ?ï¼ä¸è½å å«è·¯å¾ã
//å¦æè¿åfalseï¼è¡¨ç¤ºéåè¿ç¨è¢«ç¨æ·ä¸æ¢
bool BeginBrowse(const char *filespec);
protected:
//éåç®å½dirä¸ç±filespecæå®çæ件
//对äºåç®å½,éç¨è¿ä»£çæ¹æ³
//å¦æè¿åfalse,表示ä¸æ¢éåæ件
bool BrowseDir(const char *dir,const char *filespec);
//å½æ°BrowseDiræ¯æ¾å°ä¸ä¸ªæ件,å°±è°ç¨ProcessFile
//并ææ件åä½ä¸ºåæ°ä¼ éè¿å»
//å¦æè¿åfalse,表示ä¸æ¢éåæ件
//ç¨æ·å¯ä»¥è¦å该å½æ°,å å ¥èªå·±çå¤ç代ç
virtual bool ProcessFile(const char *filename);
//å½æ°BrowseDiræ¯è¿å ¥ä¸ä¸ªç®å½,å°±è°ç¨ProcessDir
//并ææ£å¨å¤ççç®å½ååä¸ä¸çº§ç®å½åä½ä¸ºåæ°ä¼ éè¿å»
//å¦ææ£å¨å¤ççæ¯åå§ç®å½,åparentdir=NULL
//ç¨æ·å¯ä»¥è¦å该å½æ°,å å ¥èªå·±çå¤ç代ç
//æ¯å¦ç¨æ·å¯ä»¥å¨è¿éç»è®¡åç®å½ç个æ°
virtual void ProcessDir(const char
*currentdir,const char *parentdir);
};
/*********************************************/
è¿æ¯CBrowseDirçç±»å®ç°æ件 BrowseDir.cpp
/***********************************************/
#include "stdlib.h"
#include "direct.h"
#include "string.h"
#include "io.h"
#include "browsedir.h"
CBrowseDir::CBrowseDir()
{
//ç¨å½åç®å½åå§åm_szInitDir
getcwd(m_szInitDir,_MAX_PATH);
//å¦æç®å½çæåä¸ä¸ªåæ¯ä¸æ¯'\',åå¨æåå ä¸ä¸ä¸ª'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
}
bool CBrowseDir::SetInitDir(const char *dir)
{
//å ædir转æ¢ä¸ºç»å¯¹è·¯å¾
if (_fullpath(m_szInitDir,dir,_MAX_PATH) == NULL)
return false;
//å¤æç®å½æ¯å¦åå¨
if (_chdir(m_szInitDir) != 0)
return false;
//å¦æç®å½çæåä¸ä¸ªåæ¯ä¸æ¯'\',åå¨æåå ä¸ä¸ä¸ª'\'
int len=strlen(m_szInitDir);
if (m_szInitDir[len-1] != '\\')
strcat(m_szInitDir,"\\");
return true;
}
bool CBrowseDir::BeginBrowse(const char *filespec)
{
ProcessDir(m_szInitDir,NULL);
return BrowseDir(m_szInitDir,filespec);
}
bool CBrowseDir::BrowseDir
(const char *dir,const char *filespec)
{
_chdir(dir);
//é¦å æ¥æ¾dirä¸ç¬¦åè¦æ±çæ件
long hFile;
_finddata_t fileinfo;
if ((hFile=_findfirst(filespec,&fileinfo)) != -1)
{
do
{
//æ£æ¥æ¯ä¸æ¯ç®å½
//å¦æä¸æ¯,åè¿è¡å¤ç
if (!(fileinfo.attrib & _A_SUBDIR))
{
char filename[_MAX_PATH];
strcpy(filename,dir);
strcat(filename,fileinfo.name);
if (!ProcessFile(filename))
return false;
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
//æ¥æ¾dirä¸çåç®å½
//å 为å¨å¤çdirä¸çæ件æ¶ï¼æ´¾çç±»çProcessFileæå¯è½æ¹åäº
//å½åç®å½ï¼å æ¤è¿è¦éæ°è®¾ç½®å½åç®å½ä¸ºdirã
//æ§è¡è¿_findfirståï¼å¯è½ç³»ç»è®°å½ä¸äºç¸å ³ä¿¡æ¯ï¼å æ¤æ¹åç®å½
//对_findnext没æå½±åã
_chdir(dir);
if ((hFile=_findfirst("*.*",&fileinfo)) != -1)
{
do
{
//æ£æ¥æ¯ä¸æ¯ç®å½
//å¦ææ¯,åæ£æ¥æ¯ä¸æ¯ . æ ..
//å¦æä¸æ¯,è¿è¡è¿ä»£
if ((fileinfo.attrib & _A_SUBDIR))
{
if (strcmp(fileinfo.name,".") != 0 && strcmp
(fileinfo.name,"..") != 0)
{
char subdir[_MAX_PATH];
strcpy(subdir,dir);
strcat(subdir,fileinfo.name);
strcat(subdir,"\\");
ProcessDir(subdir,dir);
if (!BrowseDir(subdir,filespec))
return false;
}
}
} while (_findnext(hFile,&fileinfo) == 0);
_findclose(hFile);
}
return true;
}
bool CBrowseDir::ProcessFile(const char *filename)
{
return true;
}
void CBrowseDir::ProcessDir(const char
*currentdir,const char *parentdir)
{
}
/*************************************************
è¿æ¯ä¾åexample.cpp
/*************************************************
#include "stdio.h"
#include "BrowseDir.h"
//ä»CBrowseDiræ´¾çåºçåç±»ï¼ç¨æ¥ç»è®¡ç®å½ä¸çæ件ååç®å½ä¸ªæ°
class CStatDir:public CBrowseDir
{
protected:
int m_nFileCount; //ä¿åæ件个æ°
int m_nSubdirCount; //ä¿ååç®å½ä¸ªæ°
public:
//缺çæé å¨
CStatDir()
{
//åå§åæ°æ®æåm_nFileCountåm_nSubdirCount
m_nFileCount=m_nSubdirCount=0;
}
//è¿åæ件个æ°
int GetFileCount()
{
return m_nFileCount;
}
//è¿ååç®å½ä¸ªæ°
int GetSubdirCount()
{
//å 为è¿å ¥åå§ç®å½æ¶ï¼ä¹ä¼è°ç¨å½æ°ProcessDirï¼
//æ以å1åææ¯çæ£çåç®å½ä¸ªæ°ã
return m_nSubdirCount-1;
}
protected:
//è¦åèå½æ°ProcessFileï¼æ¯è°ç¨ä¸æ¬¡ï¼æ件个æ°å 1
virtual bool ProcessFile(const char *filename)
{
m_nFileCount++;
return CBrowseDir::ProcessFile(filename);
}
//è¦åèå½æ°ProcessDirï¼æ¯è°ç¨ä¸æ¬¡ï¼åç®å½ä¸ªæ°å 1
virtual void ProcessDir
(const char *currentdir,const char *parentdir)
{
m_nSubdirCount++;
CBrowseDir::ProcessDir(currentdir,parentdir);
}
};
void main()
{
//è·åç®å½å
char buf[256];
printf("请è¾å ¥è¦ç»è®¡çç®å½å:");
gets(buf);
//æé 类对象
CStatDir statdir;
//设置è¦éåçç®å½
if (!statdir.SetInitDir(buf))
{
puts("ç®å½ä¸åå¨ã");
return;
}
//å¼å§éå
statdir.BeginBrowse("*.*");
//ç»è®¡ç»æä¸ï¼åç®å½ä¸ªæ°ä¸å« . å ..
printf("æ件æ»æ°: %d\nåç®å½æ»æ°:
%d\n",statdir.GetFileCount(),
statdir.GetSubdirCount());
}
温馨提示:答案为网友推荐,仅供参考
第1个回答 2017-05-24
运行结果为树形输出方式。
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <stack>
#include <windows.h>
using namespace std;
/*
* 遍历lpszPath下所有文件及文件夹,并按顺序显示其中的内容.
*/
/*
* 如果扫描到文件夹,则将其存入 Dirs 队列中,并显示名称,
* 如果扫描到文件,则显示其名称;
* 当前文件夹处理完毕后就处理其下一级文件夹,下一级文件夹从队
* 列中得到.
*/
void function( LPCTSTR lpszPath,ostream & out)
{
//开始查找;
stack<TCHAR*> Dirs;
stack<int> DirDepth;
TCHAR *tmp=new TCHAR[lstrlen(lpszPath)+1];
lstrcpy(tmp,lpszPath);
if(tmp[lstrlen(tmp)-1]=='\\')
tmp[lstrlen(tmp)-1]='\0';
TCHAR szFind[MAX_PATH*2];
TCHAR szFile[MAX_PATH*2];
TCHAR *curdir;
int curdepth=1; //当前文件夹的深度
Dirs.push(tmp);
DirDepth.push(curdepth);
for(;!Dirs.empty();)
{
curdir=Dirs.top();
curdepth=DirDepth.top();
Dirs.pop();
DirDepth.pop();
lstrcpy(szFind,curdir);
lstrcat(szFind, "\\*.*"); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind != INVALID_HANDLE_VALUE) // 如果找到
{
if (curdepth >1)
out<<" ";
for(int i=1;i<curdepth-1;++i)
out<<'|'<<" ";
out<<'+'<<curdir<<endl;
do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤"." ".." 这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
wsprintf(szFile, "%s\\%s", curdir, wfd.cFileName);
//function(szFile); // 如果找到的是目录,则进入此目录进行递归
TCHAR* tmp=new TCHAR[lstrlen(szFile)+2];
lstrcpy(tmp,szFile);
Dirs.push(tmp);
DirDepth.push(curdepth+1);
}
else
{
//输出文件名
out<<" ";
for(int i=1;i<curdepth;++i)
out<<'|'<<" ";
out<<wfd.cFileName<<endl;
}
} while (FindNextFile(hFind, &wfd));
}// if
delete [] curdir;
FindClose(hFind); // 关闭查找句柄
}// for()
}
int main(int argc,char *argv[])
{
ofstream fout("遍历结果.txt");
if(argc<=1)
{
cerr<<endl<<"文件夹遍历,请输入路径:";
TCHAR path[MAX_PATH];
cin>>path;
function(path,fout);
}
else
{
function(argv[1],fout);
}
return 0;
}
#include <iostream>
#include <iomanip>
#include <fstream>
#include <cstdio>
#include <stack>
#include <windows.h>
using namespace std;
/*
* 遍历lpszPath下所有文件及文件夹,并按顺序显示其中的内容.
*/
/*
* 如果扫描到文件夹,则将其存入 Dirs 队列中,并显示名称,
* 如果扫描到文件,则显示其名称;
* 当前文件夹处理完毕后就处理其下一级文件夹,下一级文件夹从队
* 列中得到.
*/
void function( LPCTSTR lpszPath,ostream & out)
{
//开始查找;
stack<TCHAR*> Dirs;
stack<int> DirDepth;
TCHAR *tmp=new TCHAR[lstrlen(lpszPath)+1];
lstrcpy(tmp,lpszPath);
if(tmp[lstrlen(tmp)-1]=='\\')
tmp[lstrlen(tmp)-1]='\0';
TCHAR szFind[MAX_PATH*2];
TCHAR szFile[MAX_PATH*2];
TCHAR *curdir;
int curdepth=1; //当前文件夹的深度
Dirs.push(tmp);
DirDepth.push(curdepth);
for(;!Dirs.empty();)
{
curdir=Dirs.top();
curdepth=DirDepth.top();
Dirs.pop();
DirDepth.pop();
lstrcpy(szFind,curdir);
lstrcat(szFind, "\\*.*"); // 找所有文件
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(szFind, &wfd);
if (hFind != INVALID_HANDLE_VALUE) // 如果找到
{
if (curdepth >1)
out<<" ";
for(int i=1;i<curdepth-1;++i)
out<<'|'<<" ";
out<<'+'<<curdir<<endl;
do
{
if (wfd.cFileName[0] == '.')
continue; // 过滤"." ".." 这两个目录
if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
wsprintf(szFile, "%s\\%s", curdir, wfd.cFileName);
//function(szFile); // 如果找到的是目录,则进入此目录进行递归
TCHAR* tmp=new TCHAR[lstrlen(szFile)+2];
lstrcpy(tmp,szFile);
Dirs.push(tmp);
DirDepth.push(curdepth+1);
}
else
{
//输出文件名
out<<" ";
for(int i=1;i<curdepth;++i)
out<<'|'<<" ";
out<<wfd.cFileName<<endl;
}
} while (FindNextFile(hFind, &wfd));
}// if
delete [] curdir;
FindClose(hFind); // 关闭查找句柄
}// for()
}
int main(int argc,char *argv[])
{
ofstream fout("遍历结果.txt");
if(argc<=1)
{
cerr<<endl<<"文件夹遍历,请输入路径:";
TCHAR path[MAX_PATH];
cin>>path;
function(path,fout);
}
else
{
function(argv[1],fout);
}
return 0;
}