• 文件管理


    #pragma once
    #include <Strsafe.h>
    #include <list>
    using std::list;
    
    typedef struct _FILE_INFO 
    {
        WCHAR      szFilePath[MAX_PATH];       // 文件路径
        BOOL       bIsFolder;                  // 是否为文件夹
        DWORD64    qwFileSize;                 // 文件大小
        DWORD      dwAttribute;                // 文件属性
        WCHAR      szAttributeDescription[16]; // 文件属性描述
        SYSTEMTIME stcCreatTime;               // 创建时间
        SYSTEMTIME stcLastAccessTime;          // 最后访问时间
        SYSTEMTIME stcLastWriteTime;           // 最后写入时间
    }FILE_INFO,*PFILE_INFO;
    
    
    class CFileControl
    {
    public:
        CFileControl(void);
        CFileControl(LPCTSTR lpFileName);
        ~CFileControl(void);
    public:
        DWORD GetMyProcessDir(LPWSTR &lpDirPath);                // 获取本进程当前目录
        BOOL  SetMyProcessDir(LPWSTR lpNewDir);                  // 设置程序的当前目录
        DWORD GetMyProcessImagePath(LPWSTR &lpPath);             // 获取本进程映像路径
        DWORD GetProcessImagePath(LPWSTR lpName,LPWSTR &lpPath); // 根据进程名获取映像路径
    
        BOOL  SetFileIsOnlyRead(LPWSTR lpPath); // 设置文件为只读
        BOOL  SetFileIsHidden(LPWSTR lpPath);   // 设置文件为隐藏
    
        BOOL  GetFileAttribute(LPWSTR lpPath, FILE_INFO &stcFileInfo);  // 将文件属性压入队列
        BOOL  GetFileList(LPWSTR lpName, list<FILE_INFO> &lstFileInfo); // 获取当前目录下文件列表
        DWORD GetFileTree(LPWSTR lpName, DWORD dwLeve=1);               // 获取文件树
    private:
        HANDLE          m_hFile;
        list<FILE_INFO> m_lstFileInfo;
    };
    #include "stdafx.h"
    #include "FileControl.h"
    
    
    CFileControl::CFileControl(void){}
    CFileControl::CFileControl(LPCTSTR lpFileName)
    {
        m_hFile = CreateFile(
            lpFileName,                       // 文件名
            GENERIC_ALL,                      // 存取方式
            FILE_SHARE_WRITE|FILE_SHARE_READ, // 共享方式
            NULL,                             // 文件句柄继承属性
            CREATE_ALWAYS,                    // 操作模式
            FILE_ATTRIBUTE_ARCHIVE,           // 文件属性/标志
            NULL);                            // 模板文件句柄,一般为NULL
    
    }
    
    CFileControl::~CFileControl(void){}
    
    DWORD CFileControl::GetMyProcessDir(LPWSTR &lpDirPath)
    {
        return GetCurrentDirectory(MAX_PATH,lpDirPath);
    }
    
    BOOL CFileControl::SetMyProcessDir(LPWSTR lpNewDir)
    {
        return SetCurrentDirectory(lpNewDir);
    }
    
    DWORD CFileControl::GetMyProcessImagePath(LPWSTR &lpDirPath)
    {
        return GetModuleFileName(NULL,lpDirPath,MAX_PATH);
    }
    
    DWORD CFileControl::GetProcessImagePath(LPWSTR lpName,LPWSTR &lpPath)
    {
        return GetModuleFileName(GetModuleHandle(lpName), lpPath, MAX_PATH);
    }
    
    
    
    
    BOOL CFileControl::SetFileIsOnlyRead(LPWSTR lpPath)
    {
        // 1. 获取原来的文件属性
        DWORD dwFileAttributes = GetFileAttributes(lpPath);
        // 2. 将只读属性附加到原来的文件属性上
        dwFileAttributes |= FILE_ATTRIBUTE_READONLY;
        // 3. 设置文件属性
        return SetFileAttributes(lpPath, dwFileAttributes);
    }
    
    BOOL CFileControl::SetFileIsHidden(LPWSTR lpPath)
    {
        // 1. 获取原来的文件属性
        DWORD dwFileAttributes = GetFileAttributes(lpPath);
        // 2. 将隐藏属性附加到原来的文件属性上
        dwFileAttributes |= FILE_ATTRIBUTE_HIDDEN;
        // 3. 设置文件属性
        return SetFileAttributes(lpPath, dwFileAttributes);
    }
    
    
    BOOL CFileControl::GetFileAttribute(LPWSTR lpPath, FILE_INFO &stcFileInfo)
    {
        // 1. 文件路径
        wcscpy_s(stcFileInfo.szFilePath, lpPath);
    
        // 2. 获取时间信息
        WIN32_FILE_ATTRIBUTE_DATA wfad;
        GetFileAttributesEx( lpPath, GetFileExInfoStandard, &wfad);
        // 2.1 获取创建时间
        FILETIME ftLocal;
        FileTimeToLocalFileTime( &wfad.ftCreationTime, &ftLocal );        // 调整为系统所在时区的时间
        FileTimeToSystemTime( &ftLocal, &stcFileInfo.stcCreatTime );      // 转换为SYSTEMTIME格式
        // 2.2 获取最后访问时间
        FileTimeToLocalFileTime( &wfad.ftLastAccessTime, &ftLocal );      // 调整为系统所在时区的时间
        FileTimeToSystemTime( &ftLocal, &stcFileInfo.stcLastAccessTime ); // 转换为SYSTEMTIME格式
        // 2.3 获取最后修改时间
        FileTimeToLocalFileTime( &wfad.ftLastWriteTime, &ftLocal );       // 调整为系统所在时区的时间
        FileTimeToSystemTime( &ftLocal, &stcFileInfo.stcLastWriteTime );  // 转换为SYSTEMTIME格式
    
        // 3. 获取文件大小
        stcFileInfo.qwFileSize =   wfad.nFileSizeHigh;
        stcFileInfo.qwFileSize <<= sizeof(DWORD)*8;
        stcFileInfo.qwFileSize +=  wfad.nFileSizeLow;
    
        // 4. 文件属性
        stcFileInfo.dwAttribute = wfad.dwFileAttributes;
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_ARCHIVE)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<ARCHIVE> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_COMPRESSED)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<压缩> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_DIRECTORY)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<目录> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_ENCRYPTED)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<加密> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_HIDDEN)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<隐藏> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_NORMAL)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<NORMAL> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_OFFLINE)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<OFFLINE> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_READONLY)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<只读> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_SPARSE_FILE)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<SPARSE> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_SYSTEM)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<系统文件> ");
        if(stcFileInfo.dwAttribute&FILE_ATTRIBUTE_TEMPORARY)
            wcscpy_s(stcFileInfo.szAttributeDescription, L"<临时文件> ");
    
        return TRUE;
    }
    
    
    
    
    
    
    BOOL CFileControl::GetFileList(LPWSTR lpName, list<FILE_INFO> &lstFileInfo)
    {
        // 1. 构造代表子目录和文件夹路径的字符串,使用通配符“*”
        WCHAR szFilePath[MAX_PATH];
        StringCbCopy(szFilePath, MAX_PATH, lpName);
        StringCbCat(szFilePath, MAX_PATH, L"\*");
    
        // 2. 获取第一个文件/目录,并获得查找句柄
        WIN32_FIND_DATA FindFileData;
        HANDLE hListFile = FindFirstFile(szFilePath,&FindFileData);
        int n = GetLastError();
        if ( INVALID_HANDLE_VALUE == hListFile )   return FALSE;
    
        // 3. 开始循环遍历获取文件名
        do 
        {
            FILE_INFO stcInfo = {0};
    
            // 3.1 判断是否是本级目录或上级目录的名称,是的话则结束本次循环
            if (   !lstrcmp(FindFileData.cFileName, L".") 
                || !lstrcmp(FindFileData.cFileName, L"..") )
            {
                continue;
            }
            // 3.2 将获取到的文件名保存在结构体中
            wcscpy_s(stcInfo.szFilePath, FindFileData.cFileName);
            // 3.3 获取完整路径名
            WCHAR szFullPath[MAX_PATH];
            StringCbPrintf(szFullPath, MAX_PATH, L"%s\%s", lpName, FindFileData.cFileName);
            // 3.4 如果不是目录,则获取详细信息
            if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
                stcInfo.bIsFolder = TRUE;
            else
                GetFileAttribute(szFullPath,stcInfo);
            // 3.5 将获取到的文件信息压入到链表中
            lstFileInfo.push_back(stcInfo);
        } while ( FindNextFile(hListFile, &FindFileData) );
    
        return TRUE;
    }
    
    
    
    
    
    DWORD CFileControl::GetFileTree(LPWSTR lpName, DWORD dwLeve)
    {
        // 1. 如果层级是为0则返回,否则将层级-1后继续
        if ( !dwLeve-- )  return 0;
    
        // 2. 构造代表子目录和文件夹路径的字符串,使用通配符“*”
        WCHAR szFilePath[MAX_PATH];
        StringCbCopy(szFilePath, MAX_PATH, lpName);
        StringCbCat(szFilePath, MAX_PATH, L"\*");
    
        // 3. 获取第一个文件/目录,并获得查找句柄
        WIN32_FIND_DATA FindFileData;
        HANDLE hListFile = FindFirstFile(szFilePath,&FindFileData);
        if ( INVALID_HANDLE_VALUE == hListFile )   return 0;
    
        // 4. 开始循环遍历获取文件名
        DWORD dwFileCount = 0;
        do 
        {
            // 4.1 判断是否是本级目录或上级目录的名称,是的话则结束本次循环
            if (   !lstrcmp(FindFileData.cFileName, L".") 
                || !lstrcmp(FindFileData.cFileName, L"..") )
            {
                continue;
            }
            // 4.2 获取完整路径名
            WCHAR szFullPath[MAX_PATH];
            StringCbPrintf(szFullPath, MAX_PATH, L"%s\%s", lpName, FindFileData.cFileName);
            // 4.3 如果是目录,则递归调用,列举下级目录
            if(FindFileData.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)
                dwFileCount += GetFileTree(szFullPath,dwLeve);
            // 4.4 将文件数量+1
            dwFileCount++;
        } while ( FindNextFile(hListFile, &FindFileData) );
    
        // 5. 返回本次遍历到的文件总数
        return dwFileCount;
    }
    让数据变得更安全!
  • 相关阅读:
    Python学习笔记捌——面向对象高级编程
    Python学习笔记五,函数及其参数
    Python学习笔记四,dict和set
    Python学习笔记三,数组list和tuple
    Python学习笔记一,输入输出
    Linux 环境下自动化测试工具,Redhat dogtail的安装
    Testlink接口使用方法-python语言远程调用
    Python入门学习之input()与raw_input()的区别
    从客户端(&)中检测到有潜在危险的 Request.Path 值解决方案
    树莓派嵌入式开发第一课笔记
  • 原文地址:https://www.cnblogs.com/Alyoyojie/p/5283826.html
Copyright © 2020-2023  润新知