c语言实现文件查找

最近学到操作系统的文件管理,研究了一下文件查询,代码如下

1.完整版(老师给出的示例代码)

#include "windows.h"
#include "stdio.h"
int num=0;
void find(char *path,char *name)
{
    char szFind[MAX_PATH],szFile[MAX_PATH];
    WIN32_FIND_DATA fd;
    sprintf(szFind,"%s\\%s",path,name);
    HANDLE hFind=FindFirstFile(szFind,&fd);
    if(INVALID_HANDLE_VALUE!=hFind)
    {
         while(1)
         {
             printf("\n%s\\%s\n",path,fd.cFileName);
             num++;
             if(!FindNextFile(hFind,&fd))break;
         }
         FindClose(hFind);
     }
    sprintf(szFind,"%s\\*.*",path);
    hFind=FindFirstFile(szFind,&fd);
    if(INVALID_HANDLE_VALUE==hFind)return;
    while(TRUE)
    {
        if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
        {
            if(fd.cFileName[0]!='.')
            {
                sprintf(szFile,"%s\\%s",path,fd.cFileName);
                find(szFile,name);
            }
        }
        if(!FindNextFile(hFind,&fd))break;
    }
    FindClose(hFind);
}
int main()
{
    DWORD dwSize = MAX_PATH;
    char szLogicalDrives[MAX_PATH] = {0};
    char name[]="pra*.*";
    //获取逻辑驱动器号字符串
    DWORD dwResult = GetLogicalDriveStrings(dwSize,szLogicalDrives);
    //处理获取到的结果
    if (dwResult > 0 && dwResult <= MAX_PATH) {
        char* szSingleDrive = szLogicalDrives;  //从缓冲区起始地址开始
        while(*szSingleDrive)
        {
            printf("Drive: %s     ", szSingleDrive);   //输出单个驱动器的驱动器号
            switch(GetDriveType(szSingleDrive))
            {
                case DRIVE_UNKNOWN    : puts("未知的磁盘类型"); break;
                case DRIVE_NO_ROOT_DIR: puts("路径无效"); break;
                case DRIVE_REMOVABLE  : puts("可移动磁盘"); break;
                case DRIVE_FIXED      : puts("固定磁盘");
                                        find(szSingleDrive,name);
                                        break;
                case DRIVE_REMOTE     : puts("网络磁盘"); break;
                case DRIVE_CDROM      : puts("光驱"); break;
                case DRIVE_RAMDISK    : puts("内存映射盘"); break;
                default:break;
            }
            // 获取下一个驱动器号起始地址
            szSingleDrive += strlen(szSingleDrive) + 1;
        }
    }
    return 0;
}




2.分析

 
 

///获取盘符

DWORD dwSize = MAX_PATH;

    char szLogicalDrives[MAX_PATH] = {0};//获取逻辑驱动器号字符串

    DWORD dwResult =GetLogicalDriveStrings(dwSize,szLogicalDrives);

char* szSingleDrive =szLogicalDrives;  //从缓冲区起始地址开始

while(* szSingleDrive){

printf("Drive: %s     ", szSingleDrive);  

szSingleDrive += strlen(szSingleDrive)+ 1;}

///获取当前目录下目标文件

char szFind[MAX_PATH];

    WIN32_FIND_DATA fd;

sprintf(szFind,"%s\\%s",path,name);

HANDLEhFind=FindFirstFile(szFind,&fd);

    if(INVALID_HANDLE_VALUE!=hFind)

    {

         while(1)

         {

            printf("\n%s\\%s\n",path,fd.cFileName);

             num++;

            if(!FindNextFile(hFind,&fd))break;

         }

         FindClose(hFind);

     }

///获取目录

sprintf(szFind,"%s\\*.*",path);

hFind=FindFirstFile(szFind,&fd);

if(INVALID_HANDLE_VALUE==hFind)return0;

while(TRUE)

 {

     if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)

       {

          if(fd.cFileName[0]!='.')

          {

            sprintf(szFile,"%s\\%s",path,fd.cFileName);

             find(szFile,name);//递归调用

           }

      }

      if(!FindNextFile(hFind,&fd))break;

    }

FindClose(hFind);

3.知识点:
  1. 盘符的类型很多,可以用GetDriveType(当前盘符)【GetDriveType(szSingleDrive)】获取
  2. 获取下一个盘符:szSingleDrive += strlen(szSingleDrive) + 1;
  3. 文件: FindFirstFile(szFind,&fd)与FindNextFile(hFind,&fd),可以用或者判定前者是否结束
  4.  WIN32_FIND_DATA,该结构的内容如下:
  5. 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;
  1.  #define FILE_ATTRIBUTE_DIRECTORY  0x00000010  文件夹 第5位
                      判断是文件还是目录
                     fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY   &:相同为1,不同为0
                     if(fd.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)运算为1就是文件夹,0为文件
  1. if(fd.cFileName[0]!='.')  .表示当前路径,..表示后退一布路径
 
 

4.简单文件查询(根据windows自带的文件查询命令简化)

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
    DWORD dwDriveStrLen;
    char wDrivesName[ 0x100 ];
    dwDriveStrLen = sizeof( wDrivesName );
    GetLogicalDriveStrings(dwDriveStrLen, wDrivesName);
    char *p = ( char * )wDrivesName;//得到所有盘符 

    char str[1000],name[100];
    scanf("%s",name);
    while( *p )
    {
        sprintf(str,"for /r %s %%i in (%s) do @echo %%i",p,name);
        p += ( strlen( p ) + 1 );
        system(str);//执行查询命令
    }
    return 0;
}



猜你喜欢

转载自blog.csdn.net/zhonghuachun/article/details/72909755