关于std::filesystem::is_regular_file(path)
, cppreference.com说:
检查给定的文件状态或路径是否对应于常规文件[…]相当于
s.type() == file_type::regular
。
例如,在Linux内核中,文件类型在头文件sys/stat.h
中声明。下面列出了每种Linux文件类型的类型名和符号名:
- 插座(S_IFSOCK) 符号链接(S_IFLNK)
- 常规文件(S_IFREG)
- 阻塞特殊文件(S_IFBLK)
- 目录(S_IFDIR)
- 字符设备(S_IFCHR)
- FIFO (named pipe) (S_IFIFO)
这个函数在Windows上检查的是什么?
既然我们谈论的是Windows,我们可以考虑MS实现的标准库,这就是他们如何确定文件是否是常规的:
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
或者一个目录,那么它就是一个常规文件。