Windows下C语言查找文件例子

来源:互联网 发布:python __ 编辑:程序博客网 时间:2024/06/07 06:19
[cpp] view plaincopy
  1.  

    本实例可以查找如:*.txt or *.dll or *.*目录下的所有文件名:效果如下图所示
  2. #include "stdafx.h"
    #include <windows.h>
    #include <iostream.h>
    #include <WINERROR.H> //error code find and notes
    int main(int argc, char* argv[])
    {
     
     WIN32_FIND_DATA wfd;
     HANDLE hFind; 
     //hFind=FindFirstFile("d:\\*.txt",&wfd);
     //hFind=FindFirstFile("C:\\Program Files\\Internet Explorer\\*.*",&wfd);

  3.  hFind=FindFirstFile("C:\\Program Files\\Internet Explorer\\*.dll",&wfd);
      if (hFind == INVALID_HANDLE_VALUE)
       {
        cout << "Invalid File Handle. GetLastError reports " << GetLastError() << endl;
        return 0;
       }
      else
       {

  4.     cout << " File Handle. GetLastError reports " << GetLastError() << endl;
        cout<<wfd.cFileName<<endl;
     //MessageBox(NULL,wfd.cFileName,"The Finding Result",MB_OK);
       while(FindNextFile(hFind,&wfd)) 
        //MessageBox(NULL,wfd.cFileName,"The Finding Result",MB_OK);
        cout<<wfd.cFileName<<endl;
       }

     FindClose(hFind);
     return 0;

    }

  5. // 2_4.cpp : Defines the entry point for the console application.  
  6. //  
  7. //=========================================================================   
  8. // 描述   : c语言文件查找  
  9. // 使用   : cmd下search.exe 目录 文件(可以用通配符*、?)(如:search.exe E: *.java)  
  10. // 日期   : 2015年07月22日  
  11. //=========================================================================  
  12.   
  13. #include "stdafx.h"  
  14. #include <STDIO.H>  
  15. #include <MALLOC.H>  
  16. #include <STRING.H>  
  17. #include <windows.h>  
  18.   
  19. //使用链表保存每个找到的文件夹  
  20. typedef struct DirList{  
  21.     char name[256];  
  22.     DirList * next;  
  23. } *LpDirList;  
  24.   
  25. DirList * first, * last;   
  26.   
  27. //往链表中添加节点  
  28. void add(char * name)  
  29. {  
  30.     DirList * newDir = (LpDirList)malloc(sizeof(DirList));  
  31.     strcpy(newDir->name, name);  
  32.     newDir->next = NULL;  
  33.     last->next = newDir;  
  34.     last = newDir;   
  35. }  
  36.   
  37. void loopFind(char * dir, char * filename)  
  38. {  
  39.     //printf("层次遍历文件夹...\n");  
  40.     char searchName[256] = {0};  
  41.     char nextDir[256] = {0};      
  42.     strcpy(searchName, dir);  
  43.     strcat(searchName, "\\**");  
  44.     //保存找到的文件或文件夹的信息的结构体  
  45.     WIN32_FIND_DATA findData;  
  46.     HANDLE hFindFile = FindFirstFile(searchName, &findData);  
  47.     while (FindNextFile(hFindFile, &findData))  
  48.     {  
  49.         if(findData.cFileName[0] == '.'continue;  
  50.         if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)  
  51.         {  
  52.             strcpy(nextDir, dir);  
  53.             strcat(nextDir, "\\");  
  54.             strcat(nextDir, findData.cFileName);              
  55.             add(nextDir);                     
  56.             memset(nextDir, 0x00, sizeof(nextDir));  
  57.         }         
  58.     }  
  59.     //查找符合条件的文件,并输出  
  60.     char nextFileName[256] = {0};  
  61.     memset(searchName, 0x00, sizeof(searchName));  
  62.     strcpy(searchName, dir);  
  63.     strcat(searchName, "\\");  
  64.     strcat(searchName, filename);  
  65.     hFindFile = FindFirstFile(searchName, &findData);  
  66.     while (FindNextFile(hFindFile, &findData))  
  67.     {  
  68.         strcpy(nextFileName, dir);  
  69.         strcat(nextFileName, "\\");  
  70.         strcat(nextFileName, findData.cFileName);  
  71.         printf("%s\n", nextFileName);                             
  72.     }  
  73.   
  74. }   
  75.   
  76. void search(char * dir, char * filename)  
  77. {  
  78.     printf("开始搜索...\n");  
  79.     first = (LpDirList)malloc(sizeof(DirList));  
  80.     strcpy(first->name, dir);  
  81.     first->next = NULL;  
  82.     last = first;  
  83.     while (first != NULL)  
  84.     {  
  85.         loopFind(first->name, filename);  
  86.         first = first->next;  
  87.     }  
  88. }  
  89.   
  90. int main(int argc, char* argv[])  
  91. {  
  92.     if(argv[1]==NULL || argv[2]==NULL)  
  93.     {   
  94.         printf("请输入目录或文件!\n");  
  95.         return 0;  
  96.     }  
  97.     search(argv[1], argv[2]);  
  98.     return 0;  
  99. }  

结果截图:

 

首先介绍FindFirstFile 和 FindNextFile这两个函数,在介绍他们之前,先来了解一个WIN32_FIND_DATA结构

 

WIN32_FIND_DATA结构描述了由FindFirstFile 和FindNextFile查找到的文件信息

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;

我们再来看FindFirstFile函数:

HANDLE FindFirstFile(

       LPCTSTR lpFileName,     //  查找的文件类型。例如:.txt    .ini     .cpp  等后缀

       LPWIN32_FIND_DATA lpFindFileData // 得到当前所杳找文件的一些属性,包括文件名,文件 大小创建时间等

      );

此函数返回HANDLE类型的值

FindFirstFile返回的 findData 中 dwFileAttributes项的值

 可能是
 FILE_ATTRIBUTE_ARCHIVE
 FILE_ATTRIBUTE_COMPRESSED
 FILE_ATTRIBUTE_DIRECTORY        //找到的文件是一个目录文件
 FILE_ATTRIBUTE_HIDDEN
 FILE_ATTRIBUTE_NORMAL
 FILE_ATTRIBUTE_OFFLINE
 FILE_ATTRIBUTE_READONLY
 FILE_ATTRIBUTE_SYSTEM
 FILE_ATTRIBUTE_TEMPORARY

 

BOOL FindNextFile(

      HANDLE hFindFile,      //FindFirstFile返回的HANDLE

      LPWIN32_FIND_DATA lpFindFileData  //找到的文件的一些属性

      );

如果找到下一个文件返回非零,如果找不到返回零

通过这两个函数我们可以遍历一个文件下的所有文件

[cpp] view plaincopyprint?
  1. void findFile(string start)  
  2. {  
  3.              //start 是遍历的目录,如要遍历D盘下test文件夹下的所有文件,那么start = "d:\\test";  
  1.  string strtemp;  
  2. string token = ".";  
  3. string tokend = "..";  
  4. HANDLE hfile;  
  5. WIN32_FIND_DATA fileDate;//WIN32_FIND_DATA结构描述了一个由FindFirstFile, FindFirstFileEx, 或FindNextFile函数查找到的文件信息  
  6. DWORD errorcode = 0;  
  7. hfile = FindFirstFileA((start + "\\*.*").c_str() ,&fileDate);  
  8. //通过FindFirstFileA()函数,根据当前的文件存放路径查找该文件来把待操作文件的相关属性读取到WIN32_FIND_DATA结构中去  
  9. while(hfile!= INVALID_HANDLE_VALUE && errorcode != ERROR_NO_MORE_FILES)  
  10. {  
  11.   
  12.     strtemp = fileDate.cFileName;  
  13.     bool flag = false;  
  14.     if((fileDate.dwFileAttributes == FILE_ATTRIBUTE_DIRECTORY)&&(strtemp != token)&& (strtemp != tokend))  
  15.     {  
  16.         //如果当前文件是目录文件,则递归调用findFile  
[cpp] view plaincopyprint?
  1.                             flag = true;  
  2.                 cout<<strtemp<<" is a direcotry"<<endl;  
  3.                 findFile(start + "\\" + strtemp);  
  4.   
  5.             }  
  6.             else  
  7.                 cout<<strtemp<<endl;//打印文件名  
  8.             bool isNextFile = FindNextFileA(hfile,&fileDate);//判断该目录下是否还有文件  
  9.             if(flag == true && isNextFile == true)//如果还有文件,则调用SetLastError,设为NO_ERROR,这样才能继续遍历后面的文件  
  10.             SetLastError(NO_ERROR);  
  11.             else  
  12.             errorcode=GetLastError();  
  13.   
  14.   
  15.   
  16.         }  
  17. }  
 
0 0
原创粉丝点击