如何遍历文件夹中所有的文件夹和文件 已知一个目录地址,如何找出它包含的所有文件夹。已知一个目录地址,如何找出它包含的所有文件?谢谢。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 bool getSubDirectoris(const AcString& szDir, AcStringList& szDirs){ if(szDir.empty()) return false; WIN32_FIND_DATA FindFileData; HANDLE hFind = ::FindFirstFile(szDir.c_str(), &FindFileData); if( hFind == INVALID_HANDLE_VALUE) return false; bool bNext = true; while(bNext) { if( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY) { szDirs.push_back(AcString(FindFileData.cFileName)); } bNext = !!::FindNextFile(hFind, &FindFileData); } szDirs.remove(TSTR(".")); szDirs.remove(TSTR("..")); ::FindClose(hFind); return true;} #include "stdlib.h"#include "direct.h"#include "string.h"#include "io.h"#include "stdio.h" void OpenList(){ BROWSEINFO bBinfo; TCHAR buffer[512] = ""; //文件名 TCHAR FullPath[512] = ""; //文件完整路径 bBinfo.hwndOwner = m_hWnd; //设置对话框所有者句柄 bBinfo.pidlRoot = NULL; bBinfo.pszDisplayName = buffer; //返回目录名缓冲区 bBinfo.lpszTitle = "视频文件"; //bBinfo.ulFlags = BIF_BROWSEINCLUDEFILES;//设置标志允许选择目录下的文件 bBinfo.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS; //设置标志只允许选择目录 bBinfo.lpfn = NULL; bBinfo.lParam = bBinfo.iImage = 0; ITEMIDLIST* lpDlist = ::SHBrowseForFolder(&bBinfo); if (lpDlist) { ::SHGetPathFromIDList(lpDlist, FullPath); TRACE(FullPath); BrowseDir(FullPath, "*.* | *.*"); }}bool BrowseDir(char *dir, char *filespec){ int len = strlen(dir); if (dir[len-1] != '\\') strcat(dir, "\\"); _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); // 这里是文件名 } } 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, "\\"); if (!BrowseDir(subdir,filespec)) return false; } } } while (_findnext(hFile, &fileinfo) == 0); _findclose(hFile); } return true;} szDirs.remove(TSTR(".")); szDirs.remove(TSTR("..")); 这么做而不放到循环中判断,效率应该好些 string szFind = "c:\\*.*" WIN32_FIND_DATA FindFileData; HANDLE hFind=FindFirstFile(szFind.c_str(),& FindFileData); if(hFind==INVALID_HANDLE_VALUE) return ; do { if(FindFileData.cFileName[0]=='.') //过滤本级目录和父目录 continue; if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //如果找到的是目录,则进入此目录进行递归 { } else //找到的是文件 { }} bool MyFind(Cstring list){ CFileFind fd; CString ParDir; ParDir = strDir; bool bfind; if( bfind = fd.FindFile( ParDir )) { fd.FindNextFile(); if (finder.IsDots()) { continue; } if (fd.GetFilePath() == strDir) { //////文件夹,存储 } else 文件,存储 } return FALSE; } 求助 如何使控件消失 音视频开发的问题 发现用向导创建的程序,要修改(特别是撤消一些比较大的事件)起来很难 请问如何利用CEditView类在向View输出文字时,在不同的行以不同的字体显示?请高手指教! 进程如何等待 大家都来关心一下这个问题! 怎样把屏幕滚回开始状态? 我失业了 痛啊 今天大放血!!! :( 我想找网上签名的东西,我做的一个ActiveX控件,没有证书,我不知道该怎么做?我怎么才能有证书呢? 记得以前见过通过命令来进行局域网聊天,那位大虾知道是怎么做的。。 TextOut参数的问题 高手看看CListCtrlEX这段代码错在哪里?谢谢!!
{
if(szDir.empty())
return false; WIN32_FIND_DATA FindFileData;
HANDLE hFind = ::FindFirstFile(szDir.c_str(), &FindFileData);
if( hFind == INVALID_HANDLE_VALUE)
return false; bool bNext = true;
while(bNext)
{
if( FindFileData.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)
{
szDirs.push_back(AcString(FindFileData.cFileName));
} bNext = !!::FindNextFile(hFind, &FindFileData);
}
szDirs.remove(TSTR("."));
szDirs.remove(TSTR(".."));
::FindClose(hFind); return true;
}
#include "direct.h"
#include "string.h"
#include "io.h"
#include "stdio.h"
void OpenList()
{
BROWSEINFO bBinfo;
TCHAR buffer[512] = ""; //文件名
TCHAR FullPath[512] = ""; //文件完整路径
bBinfo.hwndOwner = m_hWnd; //设置对话框所有者句柄
bBinfo.pidlRoot = NULL;
bBinfo.pszDisplayName = buffer; //返回目录名缓冲区
bBinfo.lpszTitle = "视频文件";
//bBinfo.ulFlags = BIF_BROWSEINCLUDEFILES;//设置标志允许选择目录下的文件
bBinfo.ulFlags = BIF_EDITBOX | BIF_RETURNONLYFSDIRS; //设置标志只允许选择目录
bBinfo.lpfn = NULL;
bBinfo.lParam = bBinfo.iImage = 0;
ITEMIDLIST* lpDlist = ::SHBrowseForFolder(&bBinfo);
if (lpDlist)
{
::SHGetPathFromIDList(lpDlist, FullPath);
TRACE(FullPath);
BrowseDir(FullPath, "*.* | *.*");
}
}bool BrowseDir(char *dir, char *filespec)
{
int len = strlen(dir);
if (dir[len-1] != '\\')
strcat(dir, "\\");
_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); // 这里是文件名
}
} 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, "\\");
if (!BrowseDir(subdir,filespec))
return false;
}
}
} while (_findnext(hFile, &fileinfo) == 0);
_findclose(hFile);
}
return true;
}
szDirs.remove(TSTR(".."));
这么做而不放到循环中判断,效率应该好些
WIN32_FIND_DATA FindFileData;
HANDLE hFind=FindFirstFile(szFind.c_str(),& FindFileData);
if(hFind==INVALID_HANDLE_VALUE)
return ;
do
{
if(FindFileData.cFileName[0]=='.') //过滤本级目录和父目录
continue;
if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) //如果找到的是目录,则进入此目录进行递归
{
}
else //找到的是文件
{
}
}
{
CFileFind fd;
CString ParDir;
ParDir = strDir;
bool bfind;
if( bfind = fd.FindFile( ParDir ))
{
fd.FindNextFile();
if (finder.IsDots())
{
continue;
}
if (fd.GetFilePath() == strDir)
{
//////文件夹,存储
}
else
文件,存储
}
return FALSE;
}