文件的查找与遍历

1、遍历 C:\Windows 目录下的所有文件,并打印出哪些有只读属性,哪些有隐藏属性,哪些有系统属性?
2、将1的结果输出到文件;
3、递归遍历 C:\Windows 目录及其子目录,将结果输出到文件。

参考文章 https://blog.csdn.net/qq_28901541/article/details/96116472

#define _CRT_SECURE_NO_WARNINGS
#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
#include "atlbase.h"
#include "atlstr.h"
using namespace std;
BOOL Traverse_File(LPCTSTR lpPath,LPCTSTR lpType)
{
    TCHAR Path[MAX_PATH] = { 0 };
    _stprintf(Path,_T("%s//%s"),lpPath,lpType);
    WIN32_FIND_DATAW FindData = { 0 };
    HANDLE hFind = FindFirstFile(Path, &FindData);
    if (hFind == INVALID_HANDLE_VALUE) return FALSE;
    BOOL bRet = NULL;
    do
    {
        bRet = FindNextFile(hFind, &FindData);
        if (!bRet) break;
        if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (_tcscmp(FindData.cFileName, _T(".")) == 0 || _tcscmp(FindData.cFileName, _T("..")) == 0) continue;
            cout << "Folder Name:\t";
            wcout << FindData.cFileName;
            cout << " ------";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) cout << " " << "ReadOnly"<< " ";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) cout << " " << "Hidden" << " ";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) cout << "System";
            cout << endl;
        }
        else
        {
            cout << "File Name:\t";
            wcout << FindData.cFileName;
            cout << " ------";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY) cout << " " << "ReadOnly" << " ";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN) cout << " " << "Hidden" << " ";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM) cout << "System";
            cout << endl;
        }

    } while (bRet);
    FindClose(hFind);
    return TRUE;
}
char* W_To_A(WCHAR* t_string)
{
    CW2A w2aObj(t_string);
    char* temp = (char*)w2aObj;
    return temp;
}
std::string unicode2gbk(std::wstring str_unicode)
{
    if (str_unicode.size() <= 0) return std::string("");
    int gbk_len = WideCharToMultiByte(CP_ACP, 0, str_unicode.c_str(), str_unicode.size(), NULL, 0, NULL, NULL);
    if (gbk_len <= 0) return std::string("");

    char* lpsz_m = nullptr;
    try
    {
        lpsz_m = new char[gbk_len + 2];
        memset(lpsz_m, 0, (gbk_len + 2) * sizeof(char));
    }
    catch (bad_alloc& e)
    {
        cout << "unicode2gbk : " << e.what() << endl;
        return std::string("");
    }

    int nRtn = WideCharToMultiByte(CP_ACP, 0, str_unicode.c_str(), str_unicode.size(), lpsz_m, gbk_len, NULL, NULL);
    if (nRtn != gbk_len)
    {
        delete[] lpsz_m;
        return std::string("");
    }

    std::string str_gbk;
    str_gbk = lpsz_m;
    delete[] lpsz_m;
    return str_gbk;
}
void EnumFiles_2(LPCTSTR lpszParentPath, LPCTSTR lpFileType)
{
    TCHAR Path[MAX_PATH] = { 0 };
    _stprintf(Path, _T("%s\\%s"), lpszParentPath, lpFileType);
    WIN32_FIND_DATAW FindData = { 0 };
    HANDLE hFind = FindFirstFile(Path, &FindData);
    fstream fs;
    fs.open("D:\\1.txt");
    if (!fs) return;
    if (hFind != INVALID_HANDLE_VALUE)
    {
        BOOL bFind = FALSE;
        do
        {
            bFind = FindNextFile(hFind, &FindData);
            if (!bFind) break;
            string tempStr;
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
            {
                if (_tcscmp(FindData.cFileName, _T(".")) == 0 || _tcscmp(FindData.cFileName, _T("..")) == 0) continue;
            
            
                tempStr += "Folder Name:\t";
                tempStr += unicode2gbk(FindData.cFileName);
                tempStr += " ------";
                if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
                {
                    tempStr += "  ReadOnly  ";
                }
                if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
                {
                    tempStr += "  System  ";
                }
                if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
                {
                    tempStr += "  Hidden";
                }
                tempStr += "\n";
    
            }
            else
            {

                tempStr += "File Name:\t";
                tempStr += unicode2gbk(FindData.cFileName);
                tempStr += " ------";
                if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
                {
                    tempStr += "  ReadOnly  ";
                }
                if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
                {
                    tempStr += "  System  ";
                }
                if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
                {
                    tempStr += "  Hidden";
                }
                tempStr += "\n";
    
            }
            if (tempStr.size() > 0) fs << tempStr.c_str();
        } while (bFind);
    }
    fs.close();
    FindClose(hFind);
}
void EnumFiles_3(LPCTSTR lpszParentPath, LPCTSTR lpFileType)
{
    if (!lpszParentPath || _tcslen(lpszParentPath) <= 0 || !lpFileType || _tcslen(lpFileType) <= 0) return;
    TCHAR Path[MAX_PATH] = {0};
    _stprintf(Path, _T("%s\\%s"), lpszParentPath, lpFileType);
    ofstream fs;
    fs.open("D:\\1.txt", ios::out | ios::app);    
    //ios::app 追加模式。所有写入都追加到文件末尾。
    //ios::ate 文件打开后定位到文件末尾。
    //ios::in 打开文件用于读取。
    //ios::out 打开文件用于写入。
    //ios::trunc 如果该文件已经存在,其内容将在打开文件之前被截断,即把文件长度设为 0
    if (!fs) return;
    WIN32_FIND_DATAW FindData = { 0 };
    HANDLE hFind = FindFirstFile(Path, &FindData);
    if (hFind == INVALID_HANDLE_VALUE) return;
    BOOL bFind = 0;
    do
    {
        bFind = FindNextFile(hFind, &FindData);
        if (!bFind) break;
        string FindName;
        CW2A Fn(FindData.cFileName);
        if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
        {
            if (_tcscmp(FindData.cFileName, _T(".")) == 0 || _tcscmp(FindData.cFileName, _T("..")) == 0) continue;
            FindName += "Folder Name: \t";
            FindName += Fn;
            FindName += "\t------";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
            {
                FindName += " ReadOnly ";
            }
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
            {
                FindName += " Hidden ";
            }
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
            {
                FindName += " System";
            }
            FindName += "\n";
            TCHAR szPath[MAX_PATH] = { 0 };
            _stprintf(szPath, _T("%s\\%s"), lpszParentPath, FindData.cFileName);
            EnumFiles_3(szPath, lpFileType);
        }
        else
        {
            FindName += "File Name:\t";
            FindName += Fn;
            FindName += "\t------";
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_READONLY)
            {
                FindName += " ReadOnly ";
            }
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_HIDDEN)
            {
                FindName += " Hidden ";
            }
            if (FindData.dwFileAttributes & FILE_ATTRIBUTE_SYSTEM)
            {
                FindName += " System";
            }
            FindName += "\n";
            
        }
        if (FindName.size() > 0) fs << FindName.c_str();
    } while (bFind);
    fs.close();
    FindClose(hFind);
}

int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, INT nCmdShow)
{
    //Traverse_File(_T("C:\Windows"),_T("*.*"));
    return 0;
}
int main()
{
    //Write_To_File(_T("D:\\1.txt"), _T("C:\Windows"), _T("*.*"));
    //EnumFiles_2(_T("C:\Windows"), _T("*.*"));
    EnumFiles_3(_T("C:\\Windows"), _T("*.*"));
    return 0;
}

 

posted on 2021-01-23 19:36  SakuraQAQ  阅读(225)  评论(0)    收藏  举报

导航