WIN32_FIND_DATA 詳細結構(附循環讀取文件代碼)


//去除路徑最后多余的斜杠和反斜杠
std::string TrimPath(std::string path)
{
    //string test3("內容");   使用引用字符數組作為參數傳給構造函數
    std::string illegal(" \t\f\v\n\r\\/");//string 賦值
    size_t pos = path.find_last_not_of(illegal);//從后往前查找與illegal不匹配的第一個位置,返回的是下標不是位數
    return path.substr(0, pos + 1);
}
//獲取當前路徑下的所有的圖片文件,輸入絕對路徑,輸出完整路徑
int FindImages(std::string path, std::vector<std::string>& output)
{
    const size_t FILE_TYPE = 10;
    const char* support_format[FILE_TYPE] = { ".bmp", ".dib",             //Windows bitmaps
        ".jpeg", ".jpg",           //JPEG files
        ".png",                    //Portable Network Graphics
        ".pbm", ".pgm", ".ppm",    //Portable image format
        ".tiff", ".tif" }; //TIFF files

    std::string trim_path = TrimPath(path);
    const char* lpPath = trim_path.c_str();
    char szFind[MAX_PATH];
    int n = 0;

    WIN32_FIND_DATAA FindFileData;

    strcpy_s(szFind, lpPath);
    strcat_s(szFind, "/*.*");

    HANDLE hFind = ::FindFirstFileA(szFind, &FindFileData);//創建搜索句柄
    if (INVALID_HANDLE_VALUE == hFind)
    {
        return 0;
    }

    int i = 0;

    do
    {
        if (!(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))//判斷查找的是不是文件夾,通過位於運算,dwFileAttributes有很多屬性
        {
            bool is_img = false;
            for (size_t i = 0; i != FILE_TYPE; i++)
            {
                std::string lower_name(FindFileData.cFileName);
                transform(lower_name.begin(), lower_name.end(),
                    lower_name.begin(), tolower); //tolower是大寫轉換成小寫的操作,將lower_name全部小寫,再存入lower_name
                const char* lower_char = lower_name.c_str();//轉換成c語言風格
                //lower_char中含有圖片格式,則is_img=true
                if (is_img = bool(strstr(lower_char, support_format[i])))
                    //strstr函數是看第二個參數是不是第一個參數的子串,如果是返回str2在str1中首次出現的地址,否則返回NULL
                {
                    break;
                }
            }
            if (is_img)
            {
                n++;
                std::string img_full_path = lpPath;
                img_full_path += "/";
                img_full_path += FindFileData.cFileName; //這里輸出完整路徑
                output.push_back(img_full_path);//output是引用類型
            }
        }
        ++i;
    } while (FindNextFileA(hFind, &FindFileData));//當下一個文件目錄不存在的時候退出循環
    FindClose(hFind);//關閉搜索句柄
    return n;
}

WIN32_FIND_DATA結構描述了一個由FindFirstFile, FindFirstFileEx, 或FindNextFile函數查找到的文件信息,

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;

可以通過FindFirstFile()函數根據當前的文件存放路徑查找該文件來把待操作文件的相關屬性讀取到WIN32_FIND_DATA結構中去:

WIN32_FIND_DATA ffd ;

HANDLE hFind = FindFirstFile("c:\\test.dat",&ffd);

在使用這個結構時不能手工修改這個結構中的任何數據,結構對於開發人員來說只能作為一個只讀數據,其所有的成員變量都會由系統完成填寫。在MSDN幫助中可以查找到關於WIN32_FIND_DATA結構的更加詳細的說明。

if(findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)

這個判斷語句是通過 將dwFileAttributes和FILE_ATTRIBUTE_DIRECTORY做位的與運算
來判斷所找到的項目是不是文件夾

因為 FindFirstFile返回的 findData 中 dwFileAttributes項的值

可能是
FILE_ATTRIBUTE_ARCHIVE
FILE_ATTRIBUTE_COMPRESSED
FILE_ATTRIBUTE_DIRECTORY
FILE_ATTRIBUTE_HIDDEN
FILE_ATTRIBUTE_NORMAL
FILE_ATTRIBUTE_OFFLINE
FILE_ATTRIBUTE_READONLY
FILE_ATTRIBUTE_SYSTEM
FILE_ATTRIBUTE_TEMPORARY
中幾項的組合值

findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
的結果只能是兩種:
FILE_ATTRIBUTE_DIRECTORY 非零值 ,if條件是真
0 ,if條件是假

通過 findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY
可以判斷 dwFileAttributes項的值中是否 FILE_ATTRIBUTE_DIRECTORY,即判斷所找到的項目是不是文件夾

摘自:http://st251256589.blog.163.com/blog/static/164876449201132074828542/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM