std::filesystem::is_regular_file(path) 在 Windows 上是什么意思?
What does std::filesystem::is_regular_file(path) mean on Windows?
关于 std::filesystem::is_regular_file(path)
, cppreference.com says:
Checks if the given file status or path corresponds to a regular file […] Equivalent to s.type() == file_type::regular
.
例如,在Linux内核中,文件类型是在头文件sys/stat.h
中声明的。下面列出了每种 Linux 文件类型的类型名称和符号名称:
- 套接字 (S_IFSOCK)
- 符号 link (S_IFLNK)
- 普通文件 (S_IFREG)
- 阻止特殊文件(S_IFBLK)
- 目录(S_IFDIR)
- 字符设备(S_IFCHR)
- FIFO(命名管道)(S_IFIFO)
这个函数检查的是什么Windows?
既然我们在谈论Windows,我们可以考虑标准库的MS implementation,这就是他们判断文件是否正常的方式:
if (_Bitmask_includes(_Attrs, __std_fs_file_attr::_Reparse_point)) {
if (_Stats._Reparse_point_tag == __std_fs_reparse_tag::_Symlink) {
this->type(file_type::symlink);
return;
}
if (_Stats._Reparse_point_tag == __std_fs_reparse_tag::_Mount_point) {
this->type(file_type::junction);
return;
}
// All other reparse points considered ordinary files or directories
}
if (_Bitmask_includes(_Attrs, __std_fs_file_attr::_Directory)) {
this->type(file_type::directory);
} else {
this->type(file_type::regular);
}
因此,如果它不是 IO_REPARSE_TAG_MOUNT_POINT
、IO_REPARSE_TAG_SYMLINK
或目录,那么它就是一个普通文件。
关于 std::filesystem::is_regular_file(path)
, cppreference.com says:
Checks if the given file status or path corresponds to a regular file […] Equivalent to
s.type() == file_type::regular
.
例如,在Linux内核中,文件类型是在头文件sys/stat.h
中声明的。下面列出了每种 Linux 文件类型的类型名称和符号名称:
- 套接字 (S_IFSOCK)
- 符号 link (S_IFLNK)
- 普通文件 (S_IFREG)
- 阻止特殊文件(S_IFBLK)
- 目录(S_IFDIR)
- 字符设备(S_IFCHR)
- FIFO(命名管道)(S_IFIFO)
这个函数检查的是什么Windows?
既然我们在谈论Windows,我们可以考虑标准库的MS implementation,这就是他们判断文件是否正常的方式:
if (_Bitmask_includes(_Attrs, __std_fs_file_attr::_Reparse_point)) {
if (_Stats._Reparse_point_tag == __std_fs_reparse_tag::_Symlink) {
this->type(file_type::symlink);
return;
}
if (_Stats._Reparse_point_tag == __std_fs_reparse_tag::_Mount_point) {
this->type(file_type::junction);
return;
}
// All other reparse points considered ordinary files or directories
}
if (_Bitmask_includes(_Attrs, __std_fs_file_attr::_Directory)) {
this->type(file_type::directory);
} else {
this->type(file_type::regular);
}
因此,如果它不是 IO_REPARSE_TAG_MOUNT_POINT
、IO_REPARSE_TAG_SYMLINK
或目录,那么它就是一个普通文件。