查找文件

2018-04-20  本文已影响0人  7bfedbe4863a

查找第一个文件

在目录中查找其名字和属性与制定名字相匹配的第一条目录项。

HANDLE FindFirstFile(
  LPCTSTR lpFileName,  //要查找的文件的名字,支持通配符
  LPWIN32_FIND_DATA lpFindData  //被找到的文件信息
);

WIN32_FIND_DATA 结构体如下:

typedef struct _WIN32_FIND_DATAA {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    _Field_z_ CHAR   cFileName[ MAX_PATH ];
    _Field_z_ CHAR   cAlternateFileName[ 14 ];
#ifdef _MAC
    DWORD dwFileType;
    DWORD dwCreatorType;
    WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAA, *PWIN32_FIND_DATAA, *LPWIN32_FIND_DATAA;
typedef struct _WIN32_FIND_DATAW {
    DWORD dwFileAttributes;
    FILETIME ftCreationTime;
    FILETIME ftLastAccessTime;
    FILETIME ftLastWriteTime;
    DWORD nFileSizeHigh;
    DWORD nFileSizeLow;
    DWORD dwReserved0;
    DWORD dwReserved1;
    _Field_z_ WCHAR  cFileName[ MAX_PATH ];
    _Field_z_ WCHAR  cAlternateFileName[ 14 ];
#ifdef _MAC
    DWORD dwFileType;
    DWORD dwCreatorType;
    WORD  wFinderFlags;
#endif
} WIN32_FIND_DATAW, *PWIN32_FIND_DATAW, *LPWIN32_FIND_DATAW;
#ifdef UNICODE
typedef WIN32_FIND_DATAW WIN32_FIND_DATA;
typedef PWIN32_FIND_DATAW PWIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAW LPWIN32_FIND_DATA;
#else
typedef WIN32_FIND_DATAA WIN32_FIND_DATA;
typedef PWIN32_FIND_DATAA PWIN32_FIND_DATA;
typedef LPWIN32_FIND_DATAA LPWIN32_FIND_DATA;
#endif // UNICODE

查找下一个文件

这个函数是基于上一个函数调用成功的基础上的。是查找下一个匹配的文件。

BOOL FindNextFile(
  HANDLE hFindNext,    //这个参数是调用FindFirstFile之后返回的句柄
  LPWIN32_FIND_DATA lpFindData  //被找到的文件信息
);

查找指定文件

这个函数可以用来在指定路径下搜索文件,如果找到指定的文件,会返回文件的完整路径名。
这个函数可以用来计算出文件名部分在这个完整路径中的相对位置。

DWORD SearchPath(
    LPCTSTR lpPath,  //可选参数,如果给了,就在指定路径下查找,如果缺省了就用缺省的Windows搜索路径。
    LPCTSTR lpFileName,  //指定要查找的文件名
    LPCTSTR lpExtension,  //可选参数。扩展名,如果指定了这个参数,那么在搜索时要把这个扩展名加到文件名的后面,扩展名要是 . 开头的,并且只有在前面的文件名中不含扩展名的情况下才能把它加上
    DWORD nBufferLength,  //缓冲区大小
    LPTSTR lpBuffer,  //缓冲区,用来接收根据找到的文件所确定的完整路径名
    LPTSTR lpFilePart  //用来返回查找出的完整路径名后的最后一个成分的地址,即这个文件名的完整路径名的缓冲区中的地址。
);

默认的搜索路径是:

用法如下:

    LPWSTR lpStr1 = new WCHAR[MAX_PATH];
    if (lpStr1 != NULL)
    {
        LPTSTR* lpStr = new LPTSTR;
        if (lpStr == NULL)
        {
            delete[] lpStr1;
            return -1;
        }
        SearchPath(NULL, L"1", L".txt", MAX_PATH, lpStr1, lpStr);

        delete[] lpStr1;
        delete lpStr;
    }

得到的结果:

查找结束

BOOL FindClose(
    HANDLE hFindFile    //在FindFirstFile中创建的查找文件的句柄用这个来关闭
);

一个实例

查找指定目录下的所有文件

#include "stdafx.h"  
#include<vector>  
#include <Windows.h>  
#include <fstream>    
#include <iterator>  
#include <atlstr.h>
#include <strsafe.h>

void find(CString strPath, std::vector<CString> &fileList)
{
    WIN32_FIND_DATA FindFileData;

    CString strFind = strPath;
    strFind += "\\*.*";

    HANDLE hFind = ::FindFirstFile(strFind, &FindFileData);
    if (INVALID_HANDLE_VALUE == hFind)    return;

    while (true)
    {
        if (FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (FindFileData.cFileName[0] != '.')
            {
                CString strFile = strPath;
                strFile += "\\";
                strFile += FindFileData.cFileName;
                find(strFile, fileList);
            }
        }
        else
        { 
            fileList.push_back(FindFileData.cFileName);
        }
        if (!FindNextFile(hFind, &FindFileData))    break;
    }
    FindClose(hFind);
}

int main()
{
    std::vector<CString> fileList;//定义一个存放结果文件名称的链表  

    //遍历一次结果的所有文件,获取文件名列表  
    find(L"D:\\vs_project\\test1", fileList);//之后可对文件列表中的文件进行相应的操作  

    return 0;
}
上一篇 下一篇

猜你喜欢

热点阅读