• C,C++文件和目录操作的一些整理


    // 文件和目录操作
    #ifndef _FILE_DIR_H_
    #define _FILE_DIR_H_
    
    #include <iostream>
    #include <vector>
    #include <string>
    
    void mkDir(const std::string &dirPath);
    int removeDir(const std::string &path);
    
    bool checkExist(const std::string &Path);
    
    int countFile(const std::string &dirPath, const std::string &filter);
    int countDir(const std::string &dirPath);
    
    void getAllFiles(const std::string &path, const std::string &filenameExtension, std::vector<std::string>& files);
    void getAllDirs(const std::string &path, std::vector<std::string>& dirs);
    
    void copyAllJpg(const std::string &sourcePath, const std::string &targetPath);
    void copyAllJpg_FromTxt(const std::string &txtPath, const std::string &targetPath, const std::string &newTxtPath);
    void copyAllModel(const std::string &sourcePath, const std::string &targetPath);
    
    void newCopyFile(const char* src, const char* target);
    
    #endif
    #include "File_Dir.h"
    #include <fstream>
    #include <direct.h>
    #include <io.h>
    #include <windows.h>
    
    // 创建文件夹
    void mkDir(const std::string &dirPath)
    {
        _mkdir(dirPath.c_str());
    }
    
    // 重命名
    // rename movefile...
    
    // 删除该文件夹,包括其中所有的文件和文件夹
    int removeDir(const std::string &path)
    {
        long hFile = 0;
        struct _finddata_t fileinfo;
        std::string p;
        if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1)
        {
            do
            {
                // 如果是目录,迭代之
                // 如果不是,直接删除
                if ((fileinfo.attrib &  _A_SUBDIR))
                {
                    if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    {
                        removeDir(p.assign(path).append("\").append(fileinfo.name));
                    }
                }
                else
                {
                    remove((p.assign(path).append("\").append(fileinfo.name)).c_str());
                }
            } while (_findnext(hFile, &fileinfo) == 0);
    
            _findclose(hFile);
        }
    
        return rmdir(path.c_str());
    }
    
    // 检查文件,目录是否存在
    bool checkExist(const std::string &Path)
    {
        if ((_access(Path.c_str(), 0)) != -1)
        {
            return true;        
        }
        else
        {
            return false;
        }
    
    }
    
    // 计算dirPath路径下filter(如:*.jpg)文件的数量
    int countFile(const std::string &dirPath, const std::string &filter)
    {
        HANDLE hFind;
        WIN32_FIND_DATAA dataFind;
        BOOL bMoreFiles = TRUE;
        int iCount = 0;
    
        std::string temp = dirPath;
        temp += "\";
        temp += filter;
        
        hFind = FindFirstFileA(temp.c_str(), &dataFind);
        while (hFind != INVALID_HANDLE_VALUE && bMoreFiles == TRUE)
        {
            //判断是否是文件 
            if (dataFind.dwFileAttributes != FILE_ATTRIBUTE_DIRECTORY)
            {
                iCount++;
            }
            bMoreFiles = FindNextFileA(hFind, &dataFind);
        }
        FindClose(hFind);
    
        return iCount;
    }
    
    // 计算dirPath路径下文件夹的数量
    int countDir(const std::string &dirPath)
    {
        int iCount = 0;
        long hFile = 0;
        struct _finddata_t fileinfo;
        std::string p;
        if ((hFile = _findfirst(p.assign(dirPath).append("\*").c_str(), &fileinfo)) != -1)
        {
            do
            {
                if ((fileinfo.attrib &  _A_SUBDIR))
                {
                    if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    {
                        ++iCount;
                    }
                }
            } while (_findnext(hFile, &fileinfo) == 0);
            _findclose(hFile);
        }
        return iCount;
    }
    
    // 得到path路径下所有指定扩展名(如:.mp4)的文件名全称 
    void getAllFiles(const std::string &path, const std::string &filenameExtension, std::vector<std::string>& files)
    {
        if (!checkExist(path))
            return;
        long hFile = 0;
        struct _finddata_t fileinfo;
        std::string p;
        if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1)
        {
            do
            {
                // 如果是目录,迭代之
                // 如果不是,加入列表
                if ((fileinfo.attrib &  _A_SUBDIR))
                {
                    if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                        getAllFiles(p.assign(path).append("\").append(fileinfo.name), filenameExtension, files);
                }
                else
                {
                    if (p.assign(fileinfo.name).find(filenameExtension) != -1)
                        files.push_back(p.assign(path).append("\").append(fileinfo.name));
                }
            } while (_findnext(hFile, &fileinfo) == 0);
    
            _findclose(hFile);
        }
    }
    
    void getAllDirs(const std::string &path, std::vector<std::string>& dirs)
    {
        if (!checkExist(path))
            return;
        long hFile = 0;
        struct _finddata_t fileinfo;
        std::string p;
        if ((hFile = _findfirst(p.assign(path).append("\*").c_str(), &fileinfo)) != -1)
        {
            do
            {
                // 如果是目录, 添加到容器并迭代之        
                if ((fileinfo.attrib &  _A_SUBDIR))
                {
                    if (strcmp(fileinfo.name, ".") != 0 && strcmp(fileinfo.name, "..") != 0)
                    {
                        dirs.push_back(p.assign(path).append("\").append(fileinfo.name));
                        getAllDirs(p.assign(path).append("\").append(fileinfo.name), dirs);
                    }                    
                }            
            } while (_findnext(hFile, &fileinfo) == 0);
    
            _findclose(hFile);
        }
    }
    
    void copyAllJpg(const std::string &sourcePath, const std::string &targetPath)
    {
        std::vector<std::string> vec;
        int existNum = countFile(targetPath, "*.jpg");
        char jpgCount_name[32];
    
        getAllFiles(sourcePath, ".jpg", vec);
        for (std::string::size_type i = 0; i < vec.size(); i++)
        {
            ++existNum;
            _itoa(existNum, jpgCount_name, 10);
            std::string saveJpgPath = targetPath;
            saveJpgPath += "\";
            saveJpgPath += jpgCount_name;
            saveJpgPath += ".jpg";
            // false: 覆盖目标
            CopyFileA(vec[i].c_str(), saveJpgPath.c_str(), false);
        }
    }
    
    // 读取复制 txt 中图片,同时在目标目录下追加新的 txt
    void copyAllJpg_FromTxt(const std::string &txtPath, const std::string &targetPath, const std::string &newTxtPath)
    {
        std::vector<std::string> Jpg_List;
        std::ifstream if1(txtPath);
        while (!if1.eof())
        {
            std::string s;
            getline(if1, s);
            if (s == "")
                continue;
            Jpg_List.push_back(s);
            if (if1.eof())
                break;
        }
        if1.close();
        if1.clear();
    
        int existNum = countFile(targetPath, "*.jpg");
        char jpgCount_name[32];
        std::ofstream oftxt(newTxtPath, std::ios::app);
        if (!oftxt)
            return;
        for (std::string::size_type i = 0; i < Jpg_List.size(); i++)
        {
            ++existNum;
            _itoa(existNum, jpgCount_name, 10);
            std::string jpgName;
            jpgName.assign(jpgCount_name);
            if (jpgName.length() < 10)
            {
                jpgName.insert(0, 10 - jpgName.length(), '0');
            }
            std::string saveJpgPath = targetPath;
            saveJpgPath += "\";
            saveJpgPath += jpgName;
            saveJpgPath += ".jpg";
            // false: 覆盖目标
            CopyFileA(Jpg_List[i].c_str(), saveJpgPath.c_str(), false);
            oftxt << saveJpgPath << std::endl;
        }
        oftxt.close();
    }
    
    void copyAllModel(const std::string &sourcePath, const std::string &targetPath)
    {
        std::vector<std::string> vec;
        int existNum = countFile(targetPath, "*.model");
        char jpgCount_name[32];
    
        getAllFiles(sourcePath, ".model", vec);
        for (std::string::size_type i = 0; i < vec.size(); i++)
        {
            ++existNum;
            _itoa(existNum, jpgCount_name, 10);
            std::string saveJpgPath = targetPath;
            saveJpgPath += "\";
            saveJpgPath += jpgCount_name;
            saveJpgPath += ".model";
            // false: 覆盖目标
            CopyFileA(vec[i].c_str(), saveJpgPath.c_str(), false);
        }
    }
    
    void newCopyFile(const char* src, const char* target)
    {
        CopyFileA(src, target, false);
    }
  • 相关阅读:
    汉诺塔系列问题: 汉诺塔II、汉诺塔III、汉诺塔IV、汉诺塔V、汉诺塔VI、汉诺塔VII
    2014工大校赛题目以及解
    三国武将查询系统 //Java 访问 数据库
    LR(1)文法分析器 //c++ 实现
    维护前面的position+主席树 Codeforces Round #406 (Div. 2) E
    区间->点,点->区间,线段树优化建图+dijstra Codeforces Round #406 (Div. 2) D
    有向图博弈+出度的结合 Codeforces Round #406 (Div. 2) C
    树的性质和dfs的性质 Codeforces Round #403 (Div. 2, based on Technocup 2017 Finals) E
    还不会做! 树上的gcd 树分治 UOJ33
    树上的构造 树分治+树重心的性质 Codeforces Round #190 (Div. 2) E
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/5687056.html
Copyright © 2020-2023  润新知