文件系统提供对保存为文件(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; }