美文网首页
查找文件

查找文件

作者: 7bfedbe4863a | 来源:发表于2018-04-20 18:41 被阅读0次

    查找第一个文件

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

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

    相关文章

      网友评论

          本文标题:查找文件

          本文链接:https://www.haomeiwen.com/subject/yzuzkftx.html