查找文件

查找第一个文件

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

HANDLE FindFirstFile(
  LPCTSTR lpFileName,  //要查找的文件的名字,支持通配符
  LPWIN32_FIND_DATA lpFindData  //被找到的文件信息
);
  • 函数调用成功返回的是找到的第一个句柄,它可以用在FindNextFile和FindClose中,否则的话,返回-1。
  • 这个函数会打开一个被找到的文件的句柄,并且返回其名字与指定模式相匹配的第一个文件的信息。一旦被建立,被找到的文件句柄就可以用来寻找其他与这个模式相匹配的文件(FindNextFile)。当这个句柄不再需要时,应该关闭。

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  //被找到的文件信息
);
  • 当找到与在前面调用FindFirstFile函数中所建立的查找模式相匹配的下一个文件时,返回TRUE, 否则返回ERROR_NO_MORE_FILES。
  • 当此接口只返回单个文件的信息时,若缓冲区中存放了几个可用来满足后面FindNextFile函数调用的文件,则实现结果是不定的。并且匹配结果也不能仅仅是根据名字来匹配,这个API不能用来进行基于属性的匹配。
  • 当一个文件没有设置属性时,就返回常数FILE_ATTRIBUTES_NORMAL,并把该常数放在lpFileName所指定的数据结构的字段中。通过返回此函数,同样的数据结构接着可以用来为文件设置通常的文件属性。

查找指定文件

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

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

默认的搜索路径是:

  • 应用程序的加载路径
  • 当前目录
  • Windows系统目录(可以用GetSystemDirectory获得该目录)
  • Windows目录(可以用GetWindowsDirectory获得该目录)
  • PATH环境参量中列出的目录

用法如下:

    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;
    }

得到的结果:

  • lpStr1 D:\vs_project\test1\Debug\1.txt
  • lpStr 1.txt

查找结束

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

一个实例

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

#include "stdafx.h"  
#include  
#include   
#include     
#include   
#include 
#include 

void find(CString strPath, std::vector &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 fileList;//定义一个存放结果文件名称的链表  

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

    return 0;
}

你可能感兴趣的:(查找文件)