• Day24:文件系统


    目录

    一、firesystem简介:

            1.C++17标准才有的,其实就是对文件夹、文件目录进行操作

            2.filesystem简介:

            3.三大类:

            4.常用方法:(注:在filesystem的命名空间中 filesystem::)

                    (1)创建

                    (2)删除路径

                    (3)获取最后一次修改文件的时间

    How to convert std::filesystem::file_time_type to time_t?

    二、三大类之path类

            1.判断此路径是否存在

             2.获取路径相关的属性:

    三、三大类之file_status类

            1.创建出file_status对象:利用filesystem::status(string url)

            2.类中的方法:type()返回几种枚举类型之一(filesystem::file_type中的)

    四、三大类之file_status类

    1.遍历当前目录下所有文件 

    2.遍历当前文件夹中所有文件--->只限当前目录

    3.遍历当前文件夹下所有文件夹文件

    4.删除当前路径下的所有文件(不包含文件夹!)


    一、firesystem简介:

            1.C++17标准才有的,其实就是对文件夹、文件目录进行操作

    #include<filesystem>

            2.filesystem简介:

     函数 | Microsoft Docshttps://docs.microsoft.com/zh-cn/cpp/standard-library/filesystem-functions?view=msvc-170#copy_file

            3.三大类:

                    ①path类②file_status类 ③directory_entry类

            4.常用方法:(注:在filesystem的命名空间中 filesystem::)

                    (1)创建

                            ①create_directory(string url)

              第二个参数是一个error_code对象,通过调用error_code中的message()方法,即可进行输出是否创建成功。其次,不能连着创建一个母文件夹并在其中创建子文件夹(只能创建单层目录)

                            ②create_directories(string url) 可创建多级目录

                    注:若该路径已经存在了,是不会进行清除操作的

    1. filesystem::path url("fileBox");
    2. if (!filesystem::exists(url))
    3. {
    4. cout << "不存在" << endl;
    5. }/*一定要优先检测*/
    6. //路径存储 不做其他操作
    7. filesystem::create_directory("fileBox"); //创建单层目录
    8. error_code temp;
    9. filesystem::create_directory("fileBox/xx",temp);
    10. cout << temp.message() << endl;
    11. filesystem::create_directories("a/b/c",temp); //创建多级目录
    12. cout << temp.message() << endl;

                    (2)删除路径

                             remove_all(string url)

    filesystem::remove_all(url);

                    (3)获取最后一次修改文件的时间

                            last_write_time(string url)

            返回一个file_time_type类型,需要进一步调佣time_since_epoch()方法.count()获取时间戳的形式

    上节课主要讲了两种方式:将时间戳转化为可读时间的方法。

    ①ctime(&m_tm)

    ②std::tm* p=localtime(&m_tm);

    cout << "格式化时间:" << put_time(p, "%F %T") << endl;

               注:后来通过下面两行检测数据类型的代码发现,count()返回的并不是time_t类型,所以上述两种方法不太奏效。

    1. #include<typeinfo>
    2. typeid(m_time).name()

                 从本质入手:问题即:(from stack_overflow)

    How to convert std::filesystem::file_time_type to time_t?

                    C++20的solution:

    1. const auto fileTime = std::filesystem::last_write_time(filePath);
    2. const auto systemTime = std::chrono::clock_cast<std::chrono::system_clock>(fileTime);
    3. const auto time = std::chrono::system_clock::to_time_t(systemTime);

    所以实例代码改为:

    1. auto filetime = filesystem::last_write_time("B");
    2. const auto systemTime =
    3. std::chrono::clock_cast<std::chrono::system_clock>(filetime);
    4. const auto time = std::chrono::system_clock::to_time_t(systemTime);
    5. std::tm* p = localtime(&time);
    6. cout << "文件改动时间:" << put_time(p,"%F %T") << endl;

    二、三大类之path类

            1.判断此路径是否存在

            注:一定是 filesystem中的作用域分辨符  bool  filesystem::exist(string url) 

    1. #include<iostream>
    2. #include<filesystem>
    3. filesystem::path url("file");
    4. if (!filesystem::exists(url))
    5. {
    6. cout << "路径不存在" << endl;
    7. }

             2.获取路径相关的属性:

    (i)获取当前路径 (ii)获取根目录 (iii)相对路径 (iv)获取根名 (v)获取根路径

    1. filesystem::path curURL = filesystem::current_path();
    2. //C:\Users\team\Desktop\第24课 C++文件系统\filesystem系统\path类
    3. cout << curURL.string() << endl; //双斜杠变为单斜杠
    4. cout <<"当前路径:" << curURL << endl; //双斜杠
    5. cout << "根目录:" << curURL.root_directory() << endl;
    6. cout << "相对路径:" << curURL.relative_path() << endl;
    7. cout << "根名:" << curURL.root_name() << endl;
    8. cout << "根路径:" << curURL.root_path() << endl;

    输出:

    D:\C++\C++文件系统\filesystem系统\path类
    当前路径:"D:\\C++\\C++文件系统\\filesystem系统\\path类"
    根目录:"\\"
    相对路径:"C++\\C++文件系统\\filesystem系统\\path类"
    根名:"D:"
    根路径:"D:\\"

    三、三大类之file_status类

            1.创建出file_status对象:利用filesystem::status(string url)

            2.类中的方法:type()返回几种枚举类型之一(filesystem::file_type中的)

    1. #include <filesystem>
    2. #include <iostream>
    3. #include <string>
    4. #include <fstream>
    5. using namespace std;
    6. void test_file_status(filesystem::file_status x)
    7. {
    8. switch (x.type())
    9. {
    10. case filesystem::file_type::regular:
    11. cout << "磁盘文件" << endl;
    12. break;
    13. case filesystem::file_type::directory:
    14. cout << "目录文件" << endl;
    15. break;
    16. case filesystem::file_type::not_found:
    17. cout << "目录不存在" << endl;
    18. break;
    19. case filesystem::file_type::unknown:
    20. cout << "无法识别文件" << endl;
    21. break;
    22. }
    23. }
    24. int main()
    25. {
    26. filesystem::create_directory("file");
    27. filesystem::file_status x = filesystem::status("file");
    28. test_file_status(x);
    29. fstream file("file\\test.dat", ios::out | ios::trunc);
    30. if (!file)
    31. {
    32. cout << "文件创建失败!" << endl;
    33. }
    34. test_file_status(filesystem::status("file\\test.dat"));
    35. return 0;
    36. }

    输出:

    目录文件
    磁盘文件

    四、三大类之file_status类

    若识别不出filesystem一定是标准没调到c++17以上!

    directory_entry:文件入口
    dirctory_iterator: 遍历文件

    recursive_directory_iterator 遍历所有的(自带递归遍历所有的文件夹!!!)

    1.遍历当前目录下所有文件 

    1. //遍历当前目录下所有文件:
    2. void traverseDirectory()
    3. {
    4. filesystem::path url("D:\\BaiduNetdiskDownload");
    5. if (!filesystem::exists(url))
    6. {
    7. cout << "当前路径不存在" << endl;
    8. return;
    9. }
    10. filesystem::directory_entry input(url);//入口
    11. if (input.status().type() != filesystem::file_type::directory)
    12. {
    13. cout << "url不是目录" << endl;
    14. return;
    15. }
    16. filesystem::directory_iterator dir(url);
    17. for (auto v : dir)
    18. {/*path是一个路径对象*/
    19. cout << v.path().filename() << endl;
    20. }
    21. }

    2.遍历当前文件夹中所有文件--->只限当前目录

    1. //遍历当前文件夹中所有文件--->只限当前目录
    2. void traverseDirectoryAllFile()
    3. {
    4. filesystem::path url("D:\\BaiduNetdiskDownload");
    5. if (!filesystem::exists(url))
    6. {
    7. cout << "当前路径不存在" << endl;
    8. return;
    9. }
    10. set<string> dirset;
    11. filesystem::directory_iterator begin(url);
    12. for (filesystem::directory_iterator end; begin != end; ++begin)
    13. {
    14. if (!filesystem::is_directory(begin->path()))
    15. {
    16. dirset.insert(begin->path().filename().string());
    17. }
    18. }
    19. for (auto v : dirset)
    20. {
    21. cout << v << endl;
    22. }
    23. }

    3.遍历当前文件夹下所有文件夹文件

            recursive_directory_iterator 遍历所有的(自带递归遍历所有的文件夹!!!)

    1. //遍历当前文件夹下所有文件夹文件
    2. void traverseAllDirectoryAllFile()
    3. {
    4. filesystem::path url("D:\\BaiduNetdiskDownload");
    5. if (!filesystem::exists(url))
    6. {
    7. cout << "当前路径不存在" << endl;
    8. return;
    9. }
    10. set<string> dirset;
    11. //recursive_directory_iterator 遍历所有的(自带递归遍历所有的文件夹!!!)
    12. filesystem::recursive_directory_iterator begin(url);
    13. for (filesystem::recursive_directory_iterator end; begin != end; ++begin)
    14. {
    15. if (!filesystem::is_directory(begin->path()))
    16. {
    17. dirset.insert(begin->path().filename().string());
    18. }
    19. }
    20. for (auto v : dirset)
    21. {
    22. cout << v << endl;
    23. }
    24. }

    4.删除当前路径下的所有文件(不包含文件夹!)

    1. //删除当前路径下的所有文件(不包含文件夹!)
    2. void deleteURLAllFile()
    3. {
    4. filesystem::path root = filesystem::current_path();
    5. set<string> dirset;
    6. for (filesystem::directory_iterator end, begin(root); begin != end; ++begin)
    7. {
    8. if (!filesystem::is_directory(begin->path()))/*排除掉文件夹*/
    9. {
    10. dirset.insert(begin->path().filename().string());
    11. }
    12. }
    13. for (auto v : dirset)
    14. {
    15. if(v!="test.exe")/*程序不能把自己.exe文件删除掉,所以要排除一下*/
    16. filesystem::remove_all(v); //重载/
    17. }
    18. }

  • 相关阅读:
    OpenCV入门9——目标识别(车辆统计)
    E. Iva & Pav -前缀和 + 二分 +位运算
    MySQL索引失效的情况
    图文并茂,讲解TCP和UDP协议的原理以及区别
    python - os模块 常用api方法和demo练习
    翻译: 词频逆文档频率TF-IDF算法介绍及实现 手把手用python从零开始实现
    在Linux中部署运维监控系统WGCLOUD
    【Nginx28】Nginx学习:代理模块(二)缓存与错误处理
    【Java基础】面向对象进阶(二)
    云原生|kubernetes |kubelet服务加入系统守护进程supervisor(centos7系统下演示通过)
  • 原文地址:https://blog.csdn.net/zjjaibc/article/details/125599407