• 遍历目录 常用FindFirstFile()和FindNextFile()


    FindFirstFile  

    函数功能描述:查找指定目录的第一个文件或目录并返回它的句柄

    函数原型 :
              HANDLE FindFirstFile(
                                    LPCTSTR lpFileName,                // 目录名
                                    LPWIN32_FIND_DATA lpFindFileData   // 数据缓冲区
                                  );

    参数:

    lpFileName 
    [输入] 指向字符串的指针用于指定一个有效的目录。

    lpFindFileData 
    [输出] 指向一个WIN32_FIND_DATA的指针,用于存放找到文件或目录的信息。 

    返回值:
    如果成功,则返回找到文件或目录的句柄。在FindNextFile和FindClose函数中会用到此句柄。
    如果失败,返回INVALID_HANDLE_VALUE。要获得更多的信息调用GetLastError函数。

    备注:
    指定目录的形式应该为"..\\abc\\*.*"   就是在abc目录中找第一个文件或目录。
    WIN32_FIND_DATA的结构中包含很多文件或目录的有用信息,后面的程序或许会用到。该结构如下:

    typedef struct _WIN32_FIND_DATA {
       DWORD     dwFileAttributes; 
       FILETIME ftCreationTime; 
       FILETIME ftLastAccessTime; 
       FILETIME ftLastWriteTime; 
       DWORD     nFileSizeHigh; 
       DWORD     nFileSizeLow; 
       DWORD     dwReserved0; 
       DWORD     dwReserved1; 
       TCHAR     cFileName[ MAX_PATH ]; 
       TCHAR     cAlternateFileName[ 14 ]; 
    } WIN32_FIND_DATA, *PWIN32_FIND_DATA;

    使用环境:
    windows nt 3.1 和以后都可以使用
    windows 95 和以后都可以使用
    头文件   windows.h
    使用     Kernel32.lib    库

    示例代码段
    #include "windows.h"

    int main(int argc, char *argv[])
    {
       WIN32_FIND_DATA FindFileData;
       HANDLE hFind;

       printf ("Target file is %s.\n", argv[1]);

       hFind = FindFirstFile(argv[1], &FindFileData);     //注意目录的形式后面要有*.*

       if (hFind == INVALID_HANDLE_VALUE) {
         printf ("Invalid File Handle. Get Last Error reports %d\n", GetLastError ());
       } else {
         printf ("The first file found is %s\n", FindFileData.cFileName);
         FindClose(hFind);
       }

       return (0);
    }

    下面是一个输出目录里所用文件名的代码:

    #include<iostream>
    #include<stdio.h>
    #include<windows.h>
    #include<winbase.h>
    #include<string.h>
    using namespace std; 
     //遍历一个目录的文件。
     //蔡军生 2007/10/25 QQ:9073204 深圳
     class CFindFile
     {
     public:
      CFindFile(void)
      {
              m_hFind = INVALID_HANDLE_VALUE;
              m_bFound = false;
             memset(&m_FindFileData,0,sizeof(m_FindFileData));
      }
      ~CFindFile(void)
      {
             if (m_hFind != INVALID_HANDLE_VALUE)
             {
                  ::FindClose(m_hFind);
             }
      }
      //找到第一个文件。
      void First(LPCTSTR lpFileName)
      {
             m_hFind = ::FindFirstFile(lpFileName,&m_FindFileData);
             if (m_hFind != INVALID_HANDLE_VALUE)
             {
                    m_bFound = true;
             }
             else
             {
                    m_bFound = false;
             }
      }
      //查找一下文件。
      void Next(void)
      {
             m_bFound = FindNextFile(m_hFind, &m_FindFileData) ? true:false;
      }
      //是否可以查找一下文件。
      bool IsOK(void) const
      {
             return m_bFound;
      }
      //返回当前文件的属性。
      const WIN32_FIND_DATA& GetCurFile(void) 
      {
             return m_FindFileData;
      }
     protected:
      HANDLE m_hFind; //保存当查找的位置句柄。
      bool m_bFound; //当前查找是否成功。
      WIN32_FIND_DATA m_FindFileData;//保存当前文件的属性。
    };

    int main()
    {
     char *a="C:\\*";
        CFindFile findDemo;
     for (findDemo.First(a); 
     findDemo.IsOK(); 
     findDemo.Next())
     {
      cout<<findDemo.GetCurFile().cFileName;
      cout<<"  xx\n";
     }
     return 0;
    }

    这样查询到的结果会包括 .和..



    void DirectoryList(LPCSTR Path)
    {
    	WIN32_FIND_DATA FindData;
    	HANDLE hError;
    	int FileCount = 0;
    	char FilePathName[LEN];
    
    	char FullPathName[LEN];
    	strcpy(FilePathName, Path);
    	strcat(FilePathName, "\\*.*");
    	hError = FindFirstFile(FilePathName, &FindData);
    	if (hError == INVALID_HANDLE_VALUE)
    	{
    		printf("Search error!");
    		return;
    	}
    	while(::FindNextFile(hError, &FindData))
    	{
    		if (strcmp(FindData.cFileName, ".") == 0 
    			|| strcmp(FindData.cFileName, "..") == 0 )
    		{
    			continue;
    		}
    
    		wsprintf(FullPathName, "%s\\%s", Path,FindData.cFileName);
    		FileCount++;
    		printf("\n%d  %s  ", FileCount, FullPathName);
    
    		if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    		{
    			printf("<Dir>");
    			DirectoryList(FullPathName);
    		}
    	}
    }


  • 相关阅读:
    codeforces 1438D,思路非常非常巧妙的构造题
    【Azure DevOps系列】开始第一个Azure DevOps应用
    .NET Core SameSite cookie问题
    解决Caused by: java.lang.IllegalArgumentException: Property 'sqlSessionFactory' or 'sqlSessionTemplate' are required
    feign.FeignException$NotFound: status 404 reading OrdersClient#isBuyCourse(String,String)
    feign.FeignException$NotFound: status 404 reading EduClient#getCourseInfoOrder
    谷粒学院查询全部课程不显示问题
    解决java.sql.SQLException: Zero date value prohibited
    使用Visual Studio Code代码编辑器给vue安装插件,结果导致node_modules里面的安装好的依赖丢失
    Redis报错: Caused by: io.lettuce.core.RedisConnectionException: DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, ...
  • 原文地址:https://www.cnblogs.com/lgh1992314/p/5835292.html
Copyright © 2020-2023  润新知