CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

菜鸟求救,高手帮帮,100分给了,,不够回成后再给100分

楼主heyandot()2006-06-03 00:21:38 在 VC/MFC / 基础类 提问

如题(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

相关问题

关键词

得分解答快速导航

  • 帖主:heyandot

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo