支离破碎的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;
}
原文地址:https://www.cnblogs.com/GodZhuan/p/14780291.html