FindFirstFile、FindNext递归遍历硬盘的文件

来源:互联网 发布:cadseeplus是什么软件 编辑:程序博客网 时间:2024/05/16 17:48

原文地址:http://hi.baidu.com/littlestupid/item/f87dbeb25d37b394194697df

#include <windows.h>#include <iostream>using namespace std;bool Search(char *Path,char *File);bool main(){         Search("D:","2.txt");     return true;}bool Search(char *Path,char *File){         HANDLE hFind;         WIN32_FIND_DATA wfd;         ZeroMemory(&wfd,sizeof(WIN32_FIND_DATA));     char PathTemp[512];         memset(PathTemp,0,sizeof(PathTemp));         sprintf(PathTemp,"%s\\*.*",Path);     hFind=FindFirstFile(PathTemp,&wfd);         if(INVALID_HANDLE_VALUE==hFind)//如果没有找到或者查找失败        {              MessageBox(NULL,"INVALID_HANDLE_VALUE","FindFirstFile",MB_OK);          return false;        }  do      {           if('.'==wfd.cFileName[0])//如果是当前目录或者是上级目录,就直接进入下一次循环           {             continue;           }       if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)//如果该文件是文件夹           {                sprintf(PathTemp,"%s\\%s",Path,wfd.cFileName);                MessageBox(NULL,PathTemp,"Directory",MB_OK);            Search(PathTemp,File);//进入该文件夹继续搜索(递归)          }     else         {           if(0==strcmp(File,wfd.cFileName))               {                     MessageBox(NULL,"Found",wfd.cFileName,MB_OK);//找到文件               }        }}while(FindNextFile(hFind,&wfd));//文件查找的条件          FindClose(hFind);//关闭FIND句柄      return true;}

//稍加改进,可以读中文目录了//主要就是char和TCHAR的区别#include <windows.h>#include <iostream>using namespace std;bool Search(TCHAR *Path,TCHAR *File);bool main(){         Search("D:\\LittleStupid\\Search","文本文档.txt");         return true;}bool Search(TCHAR *Path,TCHAR *File){         HANDLE hFind;         WIN32_FIND_DATA wfd;         ZeroMemory(&wfd,sizeof(WIN32_FIND_DATA));         TCHAR PathTemp[512];         memset(PathTemp,0,sizeof(PathTemp));         sprintf(PathTemp,"%s\\*.*",Path);     hFind=FindFirstFile(PathTemp,&wfd);     if(INVALID_HANDLE_VALUE==hFind)         {             MessageBox(NULL,"INVALID_HANDLE_VALUE","FindFirstFile",MB_OK);             return false;         }do      {       if('.'==wfd.cFileName[0])           {               continue;           }         if(wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)           {               sprintf(PathTemp,"%s\\%s",Path,wfd.cFileName);               MessageBox(NULL,PathTemp,"Directory",MB_OK);               Search(PathTemp,File);           }       else          {          if(0==strcmp(File,wfd.cFileName))              {                    sprintf(PathTemp,"%s\\%s",Path,wfd.cFileName);                    MessageBox(NULL,"Found",PathTemp,MB_OK);              }      }}while(FindNextFile(hFind,&wfd));           FindClose(hFind);           return true;}

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

a          有一个小的细节问题需要注意一下,那就是路径要用 \\ 分隔

             比如 D:\LittleStupid\Search 要写成 D:\\LittleStupid\\Search

b         关于 WIN32_FIND_DATA 的数据结构

        typedef struct _WIN32_FIND_DATA {

    

   DWORD dwFileAttributes; //文件属性

   FILETIME ftCreationTime; // 文件创建时间

   FILETIME ftLastAccessTime; // 文件最后一次访问时间

   FILETIME ftLastWriteTime; // 文件最后一次修改时间

   DWORD nFileSizeHigh; // 文件长度高32位

   DWORD nFileSizeLow; // 文件长度低32位

   DWORD dwReserved0; // 系统保留

   DWORD dwReserved1; // 系统保留

   TCHAR cFileName[ MAX_PATH ]; // 长文件名

   TCHAR cAlternateFileName[ 14 ]; // 8.3格式文件名

      } WIN32_FIND_DATA, *PWIN32_FIND_DATA;

c      关于判断所查找的是文件还是文件夹

       从程序来看,是 wfd.dwFileAttributes 与以下这些进行 按位与 操作

       以下是搜索来的:$表示16进制,不过以下的结果都是都是非0的数;

   wfd.dwFileAttributes 与以下标志进行按位与的结果:

       FILE_ATTRIBUTE_READONTLY       =       $1;   
              FILE_ATTRIBUTE_HIDDEN       =       $2;   
              FILE_ATTRIBUTE_SYSTEM       =       $4;   
              FILE_ATTRIBUTE_LABEL       =       $8;   
              FILE_ATTRIBUTE_DIRECTORY       =       $10;   
              FILE_ATTRIBUTE_ARCHIVE       =       $20;   
              FILE_ATTRIBUTE_NORMAL       =       $80;   
              FILE_ATTRIBUTE_TEMPORARY       =       $100;   
              FILE_ATTRIBUTE_COMPRESSED       =       $800;

d      关于所找到的目录是当前目录和上级目录

       直接通过名字来判断;

       即判断 wfd.cFileName 里面是什么;

       当前目录是 ".",上级目录是 "..";

       一般在进行文件递归搜索的时候,看见这2个目录都要跳过去,不然会发生死循环;

       当然,用strcmp() 或者 判断 wfd.cFileName[0] 都可以达到效果的;

e      关于char 和 TCHAR

"TCHAR 可自动根据字符集而转成相应的类型,多字节时为char,UNICODE时为wchar"

"用_TCHAR你就不用考虑UNICODE问题了"   //搜索到的

f       一个宽字符转换的例子

char Temp[256];
        WCHAR WTemp[256];
            memset(Temp,0,sizeof(Temp));
            memset(WTemp,0,sizeof(WTemp));

strcpy(Temp,"Hello_World");
        MultiByteToWideChar(CP_ACP, 0, Temp, -1, WTemp,sizeof(WTemp));

g  3个函数

DeleteFile();

CopyFile();

MoveFile();//参数自己BAIDU一下吧

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

总之,这个也不能算是原创吧,因为整个学习过程都是来自网上的资料的,我最多也就是拿来消化了一下而已。因为是初学,所以,有很多不对的地方还请大家指正出来,谢谢。


1 0
原创粉丝点击