菜鸟求救,高手帮帮,100分给了,,不够回成后再给100分
如题(go_world_china 再次开贴,谢谢)
例子:比如 c:\aaa 文件夹下有test1.txt 和test2.txt 2个文件
搜索整个文件夹。
生成的文件格式如下:
c:\aaa \test1.txt
c:\aaa \test2.txt
最好把源代码贴出来参考,参考,学习,学习,,
问题点数:100、回复次数:16Top
1 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 00:36:09 得分 0
给你一个类
findfile.h
#define FINDFILE_CONTINUE 0
#define FINDFILE_ABORT 1
#define FINDFILE_BREAK 2
#define FINDFILE_SKIP 3
typedef DWORD (WINAPI *LPFINDFILE_NOTIFY_ROUTINE)(
LPWIN32_FIND_DATA lpFindData, LPCTSTR lpPath
);
class CFindFile
{
public:
CFindFile( void );
BOOL Find( LPCTSTR lpRootPath, LPFINDFILE_NOTIFY_ROUTINE lpFindRoutine,
BOOL bRecursionFind = TRUE, LPCTSTR lpWildcard = NULL );
private:
void ResetWildcard( void );
BOOL FindProc( LPCTSTR lpRootPath );
DWORD FindNotify( const LPWIN32_FIND_DATA lpFindData, LPCTSTR lpPath );
private:
TCHAR m_szWildcard[MAX_PATH];
DWORD m_dwWildcardLen;
BOOL m_bRecursionFind;
LPFINDFILE_NOTIFY_ROUTINE m_lpFindRoutine;
};
//=============================================
findfile.cpp
#include "findfile.h"
CFindFile::CFindFile( void )
{
m_bRecursionFind = TRUE;
m_lpFindRoutine = NULL;
ResetWildcard();
}
void CFindFile::ResetWildcard( void )
{
m_szWildcard[0] = _T('*');
m_szWildcard[1] = _T('\0');
m_dwWildcardLen = 1;
}
BOOL CFindFile::Find( LPCTSTR lpRootPath,
LPFINDFILE_NOTIFY_ROUTINE lpFindRoutine,
BOOL bRecursionFind, LPCTSTR lpWildcard )
{
if ( NULL == lpRootPath || NULL == lpFindRoutine )
{
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
// 重置通配符
ResetWildcard();
// 如果指定了通配符
if ( lpWildcard != 0 )
{
// 测算通配符长度
m_dwWildcardLen = (DWORD)lstrlen( lpWildcard );
// 如果长度超标则返回错误
if ( m_dwWildcardLen >= MAX_PATH )
{
m_dwWildcardLen = 1;
SetLastError( ERROR_INVALID_PARAMETER );
return FALSE;
}
// 复制通配符到成员
lstrcpyn( m_szWildcard, lpWildcard, MAX_PATH );
}
m_bRecursionFind = bRecursionFind;
m_lpFindRoutine = lpFindRoutine;
return FindProc( lpRootPath );
}
DWORD CFindFile::FindNotify( LPWIN32_FIND_DATA lpFindData, LPCTSTR lpPath )
{
// 检查是否找到的是路径引导
LPCTSTR lpName = lpFindData->cFileName;
return m_lpFindRoutine( lpFindData, lpPath );
}
BOOL CFindFile::FindProc( LPCTSTR lpRootPath )
{
TCHAR szFullName[MAX_PATH];
WIN32_FIND_DATA stFindData;
// 获得根目录添加通配符后的字符串长度
DWORD dwFullNameLen = lstrlen( lpRootPath ) + m_dwWildcardLen + 1;
if ( dwFullNameLen >= MAX_PATH )
{
SetLastError( ERROR_FILE_NOT_FOUND );
return FALSE;
}
// 为目录增加通配符
lstrcpyn( szFullName, lpRootPath, MAX_PATH );
lstrcat( szFullName, _T("\\") );
lstrcat( szFullName, m_szWildcard );
// 开始查找第一个文件,出错则退出
HANDLE hFindFile = FindFirstFile( szFullName, &stFindData );
if ( hFindFile == INVALID_HANDLE_VALUE )
{
return ERROR_ACCESS_DENIED == GetLastError();
}
BOOL bReturn = TRUE;
// 准备FullName;
lstrcpyn( szFullName, lpRootPath, MAX_PATH );
lstrcat( szFullName, _T("\\") );
dwFullNameLen = lstrlen( szFullName );
// 开始循环查找文件
while ( TRUE )
{
// 调用通知
DWORD dwResult = FindNotify( &stFindData, lpRootPath );
if ( FINDFILE_ABORT == dwResult )
{
bReturn = FALSE;
SetLastError( ERROR_OPERATION_ABORTED );
break;
}
if ( FINDFILE_BREAK == dwResult )
{
break;
}
// 如果找到的是路径,并且允许递归,用户也没有跳过,则查找子文件夹
if ( stFindData.cFileName[0] != _T('.') &&
(stFindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
m_bRecursionFind && FINDFILE_SKIP != dwResult )
{
lstrcpy( &szFullName[0] + dwFullNameLen, stFindData.cFileName );
// 递归调用查找
if ( FALSE == FindProc( szFullName ) )
{
// 如果出错继续返回错误
bReturn = FALSE;
break;
}
}
// 如果找不到更多的文件
if ( FALSE == FindNextFile( hFindFile, &stFindData ) )
{
// 判断是否出错
if ( GetLastError() != ERROR_NO_MORE_FILES )
{
bReturn = FALSE;
}
// 跳出循环
break;
}
}
// 关闭查找文件句柄
FindClose( hFindFile );
// 返回错误码
return bReturn;
}
//=====================================
这样用:
先定义一个回调函数,在回调函数里做处理
DWORD WINAPI FindFileNotify(LPWIN32_FIND_DATA lpFindData, LPCTSTR lpPath)
{
// lpFindData就是找到的文件信息,包括文件名等。Path是这个文件的路径
// 你可以在这里把文件名写入文件。
}
开始查找:
CFindFile ff;
ff.Find( "c:\\aaa", FindFileNotify );
Top
2 楼heyandot()回复于 2006-06-03 00:56:39 得分 0
出了八个错,,
Compiling...
findfile.cpp
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(6) : error C2065: 'WINAPI' : undeclared identifier
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(6) : error C2065: 'LPFINDFILE_NOTIFY_ROUTINE' : undeclared identifier
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(6) : error C2501: 'DWORD' : missing storage-class or type specifiers
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(6) : error C2143: syntax error : missing ';' before '('
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(7) : error C2146: syntax error : missing ')' before identifier 'lpFindData'
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(7) : error C2146: syntax error : missing ';' before identifier 'lpFindData'
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(7) : error C2501: 'LPWIN32_FIND_DATA' : missing storage-class or type specifiers
c:\documents and settings\hardy\desktop\new folder (2)\findfile.h(7) : fatal error C1004: unexpected end of file found
Error executing cl.exe.
findfile.exe - 8 error(s), 0 warning(s)
Top
3 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 00:59:03 得分 0
#include <windows.h>
汗一个,感情楼主您没写过windows程序啊Top
4 楼heyandot()回复于 2006-06-03 01:03:18 得分 0
我写了啊!!我加上去了的哦
在findfile.cpp文件里加的Top
5 楼heyandot()回复于 2006-06-03 01:05:47 得分 0
哦,,原来我的没Rebuid all 所以记录了前的错误
但是又出现了这个错误,是不是要写回调函数??请再教教吧,谢谢
Compiling...
sdf.cpp
C:\Documents and Settings\hardy\Desktop\text\sf\sdf.cpp(12) : error C2065: '_T' : undeclared identifier
Error executing cl.exe.
sdf.exe - 1 error(s), 0 warning(s)
Top
6 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:06:08 得分 0
#include <windows.h>
#include "findfile.h"
注意顺序!
或着把#include <windows.h>加到findfile.h里Top
7 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:06:37 得分 0
还有:
#include <tchar.h>Top
8 楼heyandot()回复于 2006-06-03 01:11:23 得分 0
因为我想学这个,要急用,所以麻烦你了,真不好意思,
我加了你那两个头文件
出现了这个错误
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/findfile.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
findfile.exe - 2 error(s), 0 warning(s)
我想应该是settings/link 那里的设置有些问题?对吗??可以再教教我怎么解决吗/真和12万分谢谢Top
9 楼heyandot()回复于 2006-06-03 01:15:59 得分 0
好像要加一个什么.lib
对吗?windows.lib 我试过,但错了,,Top
10 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:17:03 得分 0
是Dos程序吗?如果是,你没有写
void main()
{
}
这个主函数Top
11 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:17:39 得分 0
建立一个控制台程序,不要建win32工程Top
12 楼fireseed(【VC无敌,英明神武,千秋万代,一统江湖!】—奶油狗)回复于 2006-06-03 01:22:15 得分 0
Linking...
LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/findfile.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
链接中...
LIBCD.lib(crt0.obj) :错误 LNK2001:未能解析符号“_main”
Debug/findfile.exe :致命的错误LNK1120:1个未解析的外部声明
执行错误在link.exe。Top
13 楼heyandot()回复于 2006-06-03 01:33:10 得分 0
建立一个控制台程序是不是这样创建的:
file\new\Projects\win32 Console Application --创建空的
然后再到file\new\files\c++ Source File --在这里写findfile.cpp
我就是这样创建的,请问对吗?(太笨了吧!请再教教吧!我今天晚上一定要做到这个才敢睡,明天慢慢研究你给的代码),再次感谢Top
14 楼heyandot()回复于 2006-06-03 01:42:49 得分 0
oh..运行可以了,,Top
15 楼heyandot()回复于 2006-06-03 01:44:43 得分 0
我可以加你QQ或MSN吗??
我的QQ:250227067
MSN:hardy_liao@hotmail.comTop
16 楼crazyhardy(難得想)回复于 2006-06-03 09:43:49 得分 0
我运行了,,可是什么也没有,,是不是还要在main函数里调 用??Top




