关于vc中遍历指定目录下所有路径

yuhaoyang2012 2012-08-18 11:09:35
请教:
如何用C++语言实现遍历指定目录下所有路径,
越详细越好,谢谢大家
...全文
177 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
yuhaoyang2012 2012-08-22
  • 打赏
  • 举报
回复
请问一楼的大侠,
c++基础不好,应该看一些什么样的书籍,请推荐下,谢谢。
yyyyy_3 2012-08-20
  • 打赏
  • 举报
回复
CFileFind
leftbackfielder 2012-08-20
  • 打赏
  • 举报
回复
FindFirstFile
FindNextFile
用这两个吧.CFileFind有时候会有文件占用的问题..
vcorange 2012-08-19
  • 打赏
  • 举报
回复
我也show一个
/枚举一个目录
//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 ;
}
Gloveing 2012-08-18
  • 打赏
  • 举报
回复
新建一个find.bat
@echo off
dir /S /b dir_name >filepath.txt
exit

=========
c++中:
system("find.bat");
Eleven 2012-08-18
  • 打赏
  • 举报
回复
FindFirstFile/FindNextFile()
或者使用MFC的CFileFind类
「已注销」 2012-08-18
  • 打赏
  • 举报
回复
使用递归的方式遍历指定路劲中的文件和文件夹:
#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"。
lydsnm 2012-08-18
  • 打赏
  • 举报
回复

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


从我的程序中扣出来的,可以用的,修改修改就好了

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧