• 支离破碎的C++学习——文件系统


    文件系统提供对保存为文件(file)的永久信息的访问机制。但不同系统中文件系统的属性和操纵文件系统的方式差异巨大,下面简单介绍Microsoft Windows 和 POSIX的差异:

    1.

    • Windows 支持多个根名称,例如 c: 或 \network_name 。 文件系统由一个树林组成,每个树都有其自己的根目录(如 c: 或 \network_name ),并且每个树都有其自己的当前目录,用于完成不是绝对路径名) (相对路径名。

    • POSIX 支持单个树,无根名称、单个根目录 / 和一个当前目录。

    2.路径名的本机表示方式:

    • Windows 使用以 null 结尾的序列 wchar_t ,编码为 utf-16 (每个 acter) 一个或多个元素 char 。

    • POSIX 使用以 null 结尾的序列 char ,编码为 utf-8 (每个 acter) 的一个或多个元素 char 。

    • 类的对象 path 以本机形式存储路径名,但支持在此存储的窗体和多个外部窗体之间轻松转换:

      • 以 null 值结束的序列 char ,编码为操作系统所优先的。

      • 以 null 结尾的序列 char ,编码为 utf-8。

      • 以 null 值结束的序列 wchar_t ,编码为操作系统所优先的。

      • 以 null 结尾的序列 char16_t ,编码为 utf-16。

      • 以 null 结尾的序列 char32_t ,编码为32。

      通过使用一个或多个 codecvt facet,按需调节这些表示形式之间的相互转换。 如果未指定特定的区域设置对象,则将从全局区域设置获取这些 facet。

    3.操作系统允许你用于指定文件或目录访问权限的详细信息:

    • Windows 记录文件是只读还是可写,这对于目录没有意义。

    • 如果目录) ,POSIX 记录是否可以读取、写入或执行 (扫描的文件。 和,无论是允许所有者、所有者组还是每个人操作,还有其他一些权限。

    C++文件系统库中path类的使用

    #include <iostream>
    #include <string>
    #include <filesystem>
    namespace fs = std::filesystem;
    int main()
    {
        using std::string;
        using std::cout;
        string str = R"(C:Users王威Music许嵩 - 清明雨上.flac)";//字符串原始字面量,简化了我们在使用regex库时正则表达式的书写
        fs::path path = fs::current_path();
        cout << "current_path() = " << fs::current_path() << "
    ";//返回当前工作目录的绝对路径
        path = str;
        fs::current_path(path.parent_path());//将当前目录修改为文件对应父目录的路径
    
        if (fs::exists(path)) {
            cout << "该文件存在" << "
    ";
            cout << "current_path() = " << fs::current_path() << "
    ";//返回当前工作目录的绝对路径
    
            if (path.has_root_path())
                cout << "root_path() = " << path.root_path() << "
    ";//返回路径的根路径
    
            if (path.has_root_name())
                cout << "root_name() = " << path.root_name() << "
    ";//返回通用格式路径的根名。若路径(以通用格式)不包含根名,则返回 path() 
        
            if(path.has_root_directory())
                cout << "root_directory() = " << path.root_directory() << "
    ";//返回路径的根目录
    
            if (path.has_relative_path())
                cout << "relative_path() = " << path.relative_path() << "
    ";//返回相对于根路径的路径
            
            if (path.has_parent_path())
                cout << "parent_path() = " << path.parent_path() << "
    ";//返回对应的父目录的路径
            
            if (path.has_filename())
                cout << "filename() = " << path.filename() << "
    ";//返回路径的通用格式文件名组分
            
            if (path.has_stem())
                cout << "stem() = " << path.stem() << "
    ";//返回主干路径组分
            
            if (path.has_extension())
                cout << "extension() = " << path.extension() << "
    ";//返回文件扩展名路径组分
        }
        else cout << "该文件不存在";
        return 0;
    }
  • 相关阅读:
    接口与抽象类的区别
    全排列(按字典序)
    设置mysql数据库的密码
    android中操作SQLite注意事项
    Android: Fragment详解
    android设置组件所占的比例
    九度oj 1482:玛雅人的密码
    ACM模板
    洛谷 P1156 垃圾陷阱
    AtCoder Beginner Contest 187 F
  • 原文地址:https://www.cnblogs.com/GodZhuan/p/14780291.html
Copyright © 2020-2023  润新知