Skip to content

Commit

Permalink
fs: improve ExistsSync performance
Browse files Browse the repository at this point in the history
  • Loading branch information
anonrig committed Jun 26, 2024
1 parent aecc556 commit 0c05f7c
Showing 1 changed file with 14 additions and 15 deletions.
29 changes: 14 additions & 15 deletions src/node_file.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1003,24 +1003,23 @@ static void ExistsSync(const FunctionCallbackInfo<Value>& args) {
THROW_IF_INSUFFICIENT_PERMISSIONS(
env, permission::PermissionScope::kFileSystemRead, path.ToStringView());

uv_fs_t req;
auto make = OnScopeLeave([&req]() { uv_fs_req_cleanup(&req); });
FS_SYNC_TRACE_BEGIN(access);
int err = uv_fs_access(nullptr, &req, path.out(), 0, nullptr);
FS_SYNC_TRACE_END(access);
std::error_code error{};
auto file_path = std::filesystem::path(path.ToStringView());
bool exists = false;

#ifdef _WIN32
// In case of an invalid symlink, `uv_fs_access` on win32
// will **not** return an error and is therefore not enough.
// Double check with `uv_fs_stat()`.
if (err == 0) {
FS_SYNC_TRACE_BEGIN(stat);
err = uv_fs_stat(nullptr, &req, path.out(), nullptr);
FS_SYNC_TRACE_END(stat);
FS_SYNC_TRACE_BEGIN(stat);
auto status = std::filesystem::status(file_path, error);
FS_SYNC_TRACE_END(stat);
if (!error) {
exists = status.type() != std::filesystem::file_type::not_found;
}
#endif // _WIN32

args.GetReturnValue().Set(err == 0);
#else
FS_SYNC_TRACE_BEGIN(access);
exists = std::filesystem::exists(file_path, error);
FS_SYNC_TRACE_END(access);
#endif
args.GetReturnValue().Set(exists);
}

// Used to speed up module loading. Returns 0 if the path refers to
Expand Down

0 comments on commit 0c05f7c

Please sign in to comment.