关于vc中遍历指定目录下所有路径 请教:如何用C++语言实现遍历指定目录下所有路径,越详细越好,谢谢大家 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 FindFirstFile/FindNextFile()或者使用MFC的CFileFind类 新建一个find.bat@echo offdir /S /b dir_name >filepath.txtexit=========c++中:system("find.bat"); void TraverseDir(CString& strDir, std::vector<CString>& vecDir){ WIN32_FIND_DATA FindFileData; CString strDirTmp; strDirTmp = strDir; strDirTmp += "\\*.*"; HANDLE hFind=::FindFirstFile(strDirTmp,&FindFileData); if(INVALID_HANDLE_VALUE == hFind) { return; } while(TRUE) { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if(FindFileData.cFileName[0]!= _T('.')) { strDirTmp = strDir; strDirTmp += "\\"; strDirTmp += FindFileData.cFileName; vecDir.push_back(strDirTmp); //TraverseDir(strDirTmp,vecFile) ; } } else//是文件 { /*strDirTmp = strDir; strDirTmp += "\\"; strDirTmp += FindFileData.cFileName; vecFile.push_back(strDirTmp);*/ } if(!FindNextFile(hFind,&FindFileData)) break; } FindClose(hFind);} 从我的程序中扣出来的,可以用的,修改修改就好了 使用递归的方式遍历指定路劲中的文件和文件夹:#define _WIN32_WINNT 0x0500#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <wincon.h>#include <shlwapi.h>#pragma comment(lib, "shlwapi.lib")#include <tchar.h>BOOLEAN IsFileName(LPTSTR pszFileName){ if(pszFileName == NULL || *pszFileName == TEXT('\0')) { return FALSE; } if(*pszFileName == TEXT('.') && (*(pszFileName+1) == TEXT('\0') || *(pszFileName+1) == TEXT('.') && *(pszFileName+2) == TEXT('\0'))) { return FALSE; } return TRUE;}int FindFiles(LPTSTR pszPath){ HANDLE hFindFile; WIN32_FIND_DATA FindData; TCHAR szCurrPath[MAX_PATH+1]; TCHAR szNextPath[MAX_PATH+1]; PathCombine(szCurrPath, pszPath, TEXT("*")); hFindFile = FindFirstFile(szCurrPath, &FindData); if(INVALID_HANDLE_VALUE == hFindFile) { return -1; } do { if(!IsFileName(FindData.cFileName)) { continue; } if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { PathCombine(szNextPath, pszPath, FindData.cFileName); _tprintf(TEXT("%s: %s\n"), TEXT("path"), szNextPath); FindFiles(szNextPath); } else { PathCombine(szNextPath, pszPath, FindData.cFileName); _tprintf(TEXT("%s: %s\n"), TEXT("file"), szNextPath); } } while(FindNextFile(hFindFile, &FindData)); FindClose(hFindFile); return 0;}int _tmain(int argc, LPTSTR argv[]){ if(argc == 1) { _tprintf(TEXT("Usage: findfile <path>")); return -1; } if(!PathIsDirectory(argv[1])) { _tprintf(TEXT("Path \"%s\" doesn't exist."), argv[1]); return -1; } return FindFiles(argv[1]);}在命令行中运行编译出来的文件加路径参数,比如 findfile.exe "C:\Program Files"。 我也show一个/枚举一个目录//UNICODEVOID __stdcall Fl_EnmuDirectoryW( /*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\ */ __in LPWSTR lpDirecoryFullPath, //扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等 //如果文件没有扩展名,使用*.*才能找到 __in LPWSTR szPrepareString, //枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知 __in PENUMDIRECTORYCALLBACKW pfnDirectoryCallback, //pfnDirectoryCallback的附加参数,可为NULL,表示不再使用 __in LPVOID pDirectoryCallbackData, //枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知 __in PENUMFILECALLBACKW pfnFileCallback, //pfnFileCallback的附加参数,可为NULL,表示不使用 __in LPVOID pFileCallbackData){ if(!pfnDirectoryCallback || !pfnFileCallback) return ;//没有指定回调是不会枚举的,除非至少任意一个有效 WCHAR *pszTemp= new WCHAR[MAX_PATH];//如果分配失败就会异常 WIN32_FIND_DATAW* pfinddata = new WIN32_FIND_DATAW; HANDLE hFind=NULL; BOOL bok_dir=TRUE; BOOL bok_file=TRUE; int len=0; if(!szPrepareString) wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\*.*\0",lpDirecoryFullPath); else wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,szPrepareString); //折衷做法,防止字符路径溢出 len=lstrlenW(pszTemp)+1; if(len>MAX_PATH) { delete pfinddata; delete [] pszTemp;//如果溢出了,释放会导致异常 return ;//溢出了,实际上从长度判断没有效果,运行时库在调用lstrlenw之前先俘获到溢出 } hFind=FindFirstFileW(pszTemp,pfinddata); if(hFind==INVALID_HANDLE_VALUE){ delete pfinddata; delete [] pszTemp; return ; } do{ ZeroMemory(pszTemp,MAX_PATH*sizeof(WCHAR)); wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,pfinddata->cFileName); len=lstrlenW(pszTemp)+1; if(len>MAX_PATH) { delete pfinddata; delete [] pszTemp; return ;//------------------- } if((pfinddata->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY) ==FILE_ATTRIBUTE_DIRECTORY){ if(pfnDirectoryCallback && bok_dir) bok_dir=pfnDirectoryCallback(pszTemp,pfinddata,pDirectoryCallbackData); }else{ if(pfnFileCallback && bok_file) bok_file=pfnFileCallback(pszTemp,pfinddata,pFileCallbackData); } }while(FindNextFileW(hFind,pfinddata)&( bok_dir|bok_file)); delete pfinddata; delete [] pszTemp; return ;} FindFirstFileFindNextFile用这两个吧.CFileFind有时候会有文件占用的问题.. 关于MFC按键时间的一点疑问 CDaoRecordSet delete 出错. 急... 急需一个简单的邮件发送的源码 关于IOCP处理数据的先后问题 请问:对话框最大化怎样实现? 谁帮我看段代码???? 如何编程(API)实现声音的关闭,打开?? 如何打印delta字符。 如何在对话框中通过回车键转移控件的焦点 *****急急急*****98下的程序在2000下怎么运行不了(使用静态连接)怎样移植****谢谢**** 请教高手windows上GB2312的汉字是怎么显示在屏幕上的? MFC中树控件读xml的问题
或者使用MFC的CFileFind类
@echo off
dir /S /b dir_name >filepath.txt
exit
=========
c++中:
system("find.bat");
void TraverseDir(CString& strDir, std::vector<CString>& vecDir)
{
WIN32_FIND_DATA FindFileData;
CString strDirTmp;
strDirTmp = strDir;
strDirTmp += "\\*.*";
HANDLE hFind=::FindFirstFile(strDirTmp,&FindFileData);
if(INVALID_HANDLE_VALUE == hFind)
{
return;
}
while(TRUE)
{
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
if(FindFileData.cFileName[0]!= _T('.'))
{
strDirTmp = strDir;
strDirTmp += "\\";
strDirTmp += FindFileData.cFileName;
vecDir.push_back(strDirTmp);
//TraverseDir(strDirTmp,vecFile) ;
}
}
else//是文件
{
/*strDirTmp = strDir;
strDirTmp += "\\";
strDirTmp += FindFileData.cFileName;
vecFile.push_back(strDirTmp);*/
}
if(!FindNextFile(hFind,&FindFileData))
break;
}
FindClose(hFind);
}
从我的程序中扣出来的,可以用的,修改修改就好了
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <wincon.h>
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")
#include <tchar.h>BOOLEAN IsFileName(LPTSTR pszFileName)
{
if(pszFileName == NULL ||
*pszFileName == TEXT('\0')) {
return FALSE;
}
if(*pszFileName == TEXT('.') &&
(*(pszFileName+1) == TEXT('\0') ||
*(pszFileName+1) == TEXT('.') &&
*(pszFileName+2) == TEXT('\0'))) {
return FALSE;
}
return TRUE;
}int FindFiles(LPTSTR pszPath)
{
HANDLE hFindFile;
WIN32_FIND_DATA FindData;
TCHAR szCurrPath[MAX_PATH+1];
TCHAR szNextPath[MAX_PATH+1]; PathCombine(szCurrPath, pszPath, TEXT("*"));
hFindFile = FindFirstFile(szCurrPath, &FindData);
if(INVALID_HANDLE_VALUE == hFindFile) {
return -1;
}
do {
if(!IsFileName(FindData.cFileName)) {
continue;
}
if(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
PathCombine(szNextPath, pszPath, FindData.cFileName);
_tprintf(TEXT("%s: %s\n"), TEXT("path"), szNextPath);
FindFiles(szNextPath);
} else {
PathCombine(szNextPath, pszPath, FindData.cFileName);
_tprintf(TEXT("%s: %s\n"), TEXT("file"), szNextPath);
}
} while(FindNextFile(hFindFile, &FindData));
FindClose(hFindFile);
return 0;
}int _tmain(int argc, LPTSTR argv[])
{
if(argc == 1) {
_tprintf(TEXT("Usage: findfile <path>"));
return -1;
}
if(!PathIsDirectory(argv[1])) {
_tprintf(TEXT("Path \"%s\" doesn't exist."), argv[1]);
return -1;
}
return FindFiles(argv[1]);
}
在命令行中运行编译出来的文件加路径参数,比如 findfile.exe "C:\Program Files"。
/枚举一个目录
//UNICODE
VOID __stdcall Fl_EnmuDirectoryW(
/*目录的完整路径,不要在后面添加 \\,例如e盘,这里的调用为 e: 不要 \\ */
__in LPWSTR lpDirecoryFullPath,
//扩展名,可用通配符 *.*(同样可为NULL表示),例如 *.exe或 aaa.*等
//如果文件没有扩展名,使用*.*才能找到
__in LPWSTR szPrepareString,
//枚举lpDirecoryFullPath当前目录下得到的目录,以回调的方式通知
__in PENUMDIRECTORYCALLBACKW pfnDirectoryCallback,
//pfnDirectoryCallback的附加参数,可为NULL,表示不再使用
__in LPVOID pDirectoryCallbackData,
//枚举lpDirecoryFullPath当前目录下得到的文件,以回调的方式通知
__in PENUMFILECALLBACKW pfnFileCallback,
//pfnFileCallback的附加参数,可为NULL,表示不使用
__in LPVOID pFileCallbackData)
{
if(!pfnDirectoryCallback || !pfnFileCallback) return ;//没有指定回调是不会枚举的,除非至少任意一个有效
WCHAR *pszTemp= new WCHAR[MAX_PATH];//如果分配失败就会异常
WIN32_FIND_DATAW* pfinddata = new WIN32_FIND_DATAW;
HANDLE hFind=NULL;
BOOL bok_dir=TRUE;
BOOL bok_file=TRUE; int len=0; if(!szPrepareString)
wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\*.*\0",lpDirecoryFullPath);
else
wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,szPrepareString);
//折衷做法,防止字符路径溢出
len=lstrlenW(pszTemp)+1;
if(len>MAX_PATH) {
delete pfinddata;
delete [] pszTemp;//如果溢出了,释放会导致异常
return ;//溢出了,实际上从长度判断没有效果,运行时库在调用lstrlenw之前先俘获到溢出
}
hFind=FindFirstFileW(pszTemp,pfinddata);
if(hFind==INVALID_HANDLE_VALUE){
delete pfinddata;
delete [] pszTemp;
return ;
}
do{
ZeroMemory(pszTemp,MAX_PATH*sizeof(WCHAR));
wnsprintfW(pszTemp,MAX_PATH+1,L"%s\\%s\0",lpDirecoryFullPath,pfinddata->cFileName);
len=lstrlenW(pszTemp)+1;
if(len>MAX_PATH) {
delete pfinddata;
delete [] pszTemp;
return ;//-------------------
}
if((pfinddata->dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
==FILE_ATTRIBUTE_DIRECTORY){
if(pfnDirectoryCallback && bok_dir)
bok_dir=pfnDirectoryCallback(pszTemp,pfinddata,pDirectoryCallbackData);
}else{
if(pfnFileCallback && bok_file)
bok_file=pfnFileCallback(pszTemp,pfinddata,pFileCallbackData);
}
}while(FindNextFileW(hFind,pfinddata)&( bok_dir|bok_file));
delete pfinddata;
delete [] pszTemp;
return ;
}
FindNextFile
用这两个吧.CFileFind有时候会有文件占用的问题..