Home > database >  What does std::filesystem::is_regular_file(path) means on Windows?
What does std::filesystem::is_regular_file(path) means on Windows?

Time:04-20

About 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.

For example, in the Linux kernel, file types are declared in the header file sys/stat.h. The type name and symbolic name for each Linux file type is listed below:

  • Socket (S_IFSOCK)
  • Symbolic link (S_IFLNK)
  • Regular File (S_IFREG)
  • Block special file (S_IFBLK)
  • Directory (S_IFDIR)
  • Character device (S_IFCHR)
  • FIFO (named pipe) (S_IFIFO)

What is the thing that this function checks on Windows?

CodePudding user response:

Since we are talking about Windows we can consider MS implementation of the standard library, and that's how they determine if the file is regular:

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);
}

So if it isn't IO_REPARSE_TAG_MOUNT_POINT, IO_REPARSE_TAG_SYMLINK or a directory, then it is a regular file.

  • Related