基于c++11 的filesystem库

 

一般程序设计都有访问文件系统的需求,什么列出目录啦,删除,创建目录啦,自己写老费劲了,又要考虑跨平台实现,费心伤神。

c++17把这个给统一了,加了个filesystem,但是对于不想用或不能用c++17的人就麻烦了。

这里有个轮子可以拿去用,基于c++11实现,与c++17兼容。非常好用。

项目地址: https://github.com/gulrak/filesystem/

 

使用示例:

参见https://github.com/gulrak/filesystem/blob/master/examples/

需要注意的是,遍历目录的时候,如果不进行递归遍历,需要使用fs::directory_iterator 。

代码内不带获取可执行文件路径的函数,可以看我前面的文章。https://blog.csdn.net/v6543210/article/details/107663161

 

#include <iostream>
#include <iomanip>
#include <chrono>

#if defined(__cplusplus) && __cplusplus >= 201703L && defined(__has_include)
#if __has_include(<filesystem>)
#define GHC_USE_STD_FS
#include <filesystem>
namespace fs = std::filesystem;
#endif
#endif
#ifndef GHC_USE_STD_FS
#include <ghc/filesystem.hpp>
namespace fs = ghc::filesystem;
#endif

int main(int argc, char* argv[])
{
#ifdef GHC_FILESYSTEM_VERSION
    fs::u8arguments u8guard(argc, argv);
    if(!u8guard.valid()) {
        std::cerr << "Invalid character encoding, UTF-8 based encoding needed." << std::endl;
        std::exit(EXIT_FAILURE);
    }
#endif
    if(argc > 2) {
        std::cerr << "USAGE: du <path>" << std::endl;
        exit(1);
    }
    fs::path dir{"."};
    if(argc == 2) {
        dir = fs::u8path(argv[1]);
    }

    uint64_t totalSize = 0;
    int totalDirs = 0;
    int totalFiles = 0;
    int maxDepth = 0;
    
    try {
        auto rdi = fs::recursive_directory_iterator(dir);
        for(auto de : rdi) {
            if(rdi.depth() > maxDepth) {
                maxDepth = rdi.depth();
            }
            if(de.is_regular_file()) {
                totalSize += de.file_size();
                ++totalFiles;
            }
            else if(de.is_directory()) {
                ++totalDirs;
            }
        }
    }
    catch(fs::filesystem_error fe) {
        std::cerr << "Error: " << fe.what() << std::endl;
        exit(1);
    }
    std::cout << totalSize << " bytes in " << totalFiles << " files and " << totalDirs << " directories, maximum depth: " << maxDepth << std::endl;
    return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

路边闲人2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值