diff options
| -rw-r--r-- | zencore/filesystem.cpp | 18 | ||||
| -rw-r--r-- | zencore/include/zencore/filesystem.h | 4 |
2 files changed, 22 insertions, 0 deletions
diff --git a/zencore/filesystem.cpp b/zencore/filesystem.cpp index 663a626a1..578b28277 100644 --- a/zencore/filesystem.cpp +++ b/zencore/filesystem.cpp @@ -589,4 +589,22 @@ FileSystemTraversal::TraverseFileSystem(const std::filesystem::path& RootDir, Tr } } +std::filesystem::path +PathFromHandle(void* NativeHandle) +{ + if (NativeHandle == nullptr || NativeHandle == INVALID_HANDLE_VALUE) + { + return std::filesystem::path(); + } + + const DWORD RequiredLengthIncludingNul = GetFinalPathNameByHandleW(NativeHandle, nullptr, 0, FILE_NAME_OPENED); + + std::wstring FullPath; + FullPath.resize(RequiredLengthIncludingNul - 1); + + const DWORD FinalLength = GetFinalPathNameByHandleW(NativeHandle, FullPath.data(), RequiredLengthIncludingNul, FILE_NAME_OPENED); + + return FullPath; +} + } // namespace zen diff --git a/zencore/include/zencore/filesystem.h b/zencore/include/zencore/filesystem.h index b20a1e7c6..ba8588c5c 100644 --- a/zencore/include/zencore/filesystem.h +++ b/zencore/include/zencore/filesystem.h @@ -29,6 +29,10 @@ ZENCORE_API bool CreateDirectories(const std::filesystem::path& dir); ZENCORE_API bool CleanDirectory(const wchar_t* dir); ZENCORE_API bool CleanDirectory(const std::filesystem::path& dir); +/** Map native file handle to a path + */ +ZENCORE_API std::filesystem::path PathFromHandle(void* NativeHandle); + struct FileContents { std::vector<IoBuffer> Data; |