整了份递归代码,测试发现有如下问题
1.目录文件多了,查找出来的文件不全
2.文件名字有时也不完整
3.不用线程,能否在中途停止查找,或是判断查找结束
代码如下:int CFileManager::Find(char *filename, char *dirname, unsigned int numfound)
{ char sendbuf[100], tmpPath[256], newPath[256],PathName[256];
WIN32_FIND_DATA fd;
HANDLE fh;
LPBYTE lpList = NULL;
int nLen =0 ;
DWORD dwOffset = 0; // 位移指针
LPBYTE lpBuffer = NULL;
DWORD nBufferSize = 1024 * 10; // 先分配10K的缓冲区
DWORD dwLength = 0;
lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize); *lpList = TOKEN_FILE_FIND_LIST;
dwOffset = 1; _snprintf(tmpPath, sizeof(tmpPath), "%s\\*", dirname);
if ((fh = FindFirstFile(tmpPath, &fd)) != INVALID_HANDLE_VALUE)
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (fd.cFileName[0] != '.' || (fd.cFileName[1] && fd.cFileName[1] != '.'))
{
_snprintf(newPath,sizeof(newPath),"%s\\%s", dirname,fd.cFileName); numfound = Find(filename, newPath, numfound);
}
}
} while (FindNextFile(fh, &fd));
FindClose(fh);
_snprintf(tmpPath, sizeof(tmpPath), "%s\\%s", dirname, filename); if ((fh = FindFirstFile(tmpPath, &fd)) != INVALID_HANDLE_VALUE)
do {
numfound ++; _snprintf(PathName,sizeof(PathName),"%s\\%s",dirname,fd.cFileName);
nLen = lstrlen(PathName)+1;
memcpy(lpList+ dwOffset, PathName, nLen);
MessageBox(NULL, (char *)(lpList), PathName, NULL); } while (FindNextFile(fh, &fd));
FindClose(fh); // 关闭查找句柄return (numfound);
}
1.目录文件多了,查找出来的文件不全
2.文件名字有时也不完整
3.不用线程,能否在中途停止查找,或是判断查找结束
代码如下:int CFileManager::Find(char *filename, char *dirname, unsigned int numfound)
{ char sendbuf[100], tmpPath[256], newPath[256],PathName[256];
WIN32_FIND_DATA fd;
HANDLE fh;
LPBYTE lpList = NULL;
int nLen =0 ;
DWORD dwOffset = 0; // 位移指针
LPBYTE lpBuffer = NULL;
DWORD nBufferSize = 1024 * 10; // 先分配10K的缓冲区
DWORD dwLength = 0;
lpList = (BYTE *)LocalAlloc(LPTR, nBufferSize); *lpList = TOKEN_FILE_FIND_LIST;
dwOffset = 1; _snprintf(tmpPath, sizeof(tmpPath), "%s\\*", dirname);
if ((fh = FindFirstFile(tmpPath, &fd)) != INVALID_HANDLE_VALUE)
do {
if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
if (fd.cFileName[0] != '.' || (fd.cFileName[1] && fd.cFileName[1] != '.'))
{
_snprintf(newPath,sizeof(newPath),"%s\\%s", dirname,fd.cFileName); numfound = Find(filename, newPath, numfound);
}
}
} while (FindNextFile(fh, &fd));
FindClose(fh);
_snprintf(tmpPath, sizeof(tmpPath), "%s\\%s", dirname, filename); if ((fh = FindFirstFile(tmpPath, &fd)) != INVALID_HANDLE_VALUE)
do {
numfound ++; _snprintf(PathName,sizeof(PathName),"%s\\%s",dirname,fd.cFileName);
nLen = lstrlen(PathName)+1;
memcpy(lpList+ dwOffset, PathName, nLen);
MessageBox(NULL, (char *)(lpList), PathName, NULL); } while (FindNextFile(fh, &fd));
FindClose(fh); // 关闭查找句柄return (numfound);
}
解决方案 »
- 如何处理有道词典划词翻译对程序的影响?
- 【C++/Socket】从Windows向Linux传输文件时有细微的数据丢失?
- 2个按钮与一个新建的cbotton的子类相关联(孙鑫的逃跑按钮)
- 谁有连续的 卡通 海豚动作图片,最好是蓝白的,网上的别发给我了,我都看过了
- 在线等答案!! 比较简单的问题!!!
- 自己制作安装程序
- 读取EXCEL时 VARIANT与Colesafearray问题
- 谊加怡最新发布网管软件请各位高手下载、试用、指导!
- 服务器端接收数据后触发消息给Tab控件子窗口发消息问题
- 问:GetPrevSibling函数怎么用?谢谢你解释一下!
- IE编程问题:程序在IE6中可以通过,但是在IE7中无法运行
- 如何获取进程结束和结束返回值
{
CFileFind fileFind;
BOOL bWorking = fileFind.FindFile(strPath+L"\\*.*");
while(bWorking)
{
CString filename=fileFind.GetFileName();//取得文件名
bWorking = fileFind.FindNextFile();
if(fileFind.IsDots())continue;//如果有.或..,则continue
if(fileFind.IsDirectory())//如果找到文件夹
{
CString strDir = fileFind.GetFileName();//取得文件夹名
CString strPath1 = strPath+L"\\"+strDir;//文件夹路径
FindFile(strPath1);//循环查找
}
}
fileFind.Close();
}
CFileFind::FindFile/FileNextFile()
{
wstring root(path);
if(root[root.length() - 1] != _T('\\'))
root.push_back(_T('\\'));
wstring find_pattern = root + _T("*.*");
wstring sub_item; bool cancel = false;//cancel可以改成指向外部指针.
WIN32_FIND_DATA wfd = { 0 };
HANDLE hFile = FindFirstFile(find_pattern.c_str(),&wfd);
if(hFile == INVALID_HANDLE_VALUE)
return false;
do
{
if(!_tcsicmp(wfd.cFileName, _T(".")) || !_tcsicmp(wfd.cFileName, _T("..")))
continue;
sub_item = root + wfd.cFileName; if((wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) && inc_sub)
{
sub_item.push_back(_T('\\'));
if(!cancel)
cancel = go_through_directory_impl(sub_item.c_str(),inc_sub);
} wprintf(L"Item(%s),path(%d)\n",sub_item.c_str(),(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)); } while (FindNextFile(hFile,&wfd) && !cancel);
FindClose(hFile);
return cancel;
}
递归的时候你跟踪一下,因为你的参数是用指针,当递归内层的函数结束时,外层的参数指针还是带有内层目录指针的。char sendbuf[100], tmpPath[256], newPath[256],PathName[256];
递归最好少用栈保存路径,层次多后栈就溢出了。。