From 537cecf0e057ee9e27027c2dde1e199a1edfb275 Mon Sep 17 00:00:00 2001 From: rad9800 <105589633+rad9800@users.noreply.github.com> Date: Sun, 17 Jul 2022 19:57:06 +0100 Subject: [PATCH] Fix GetFileSize for over 2GB --- .../RfGetFileSizeFromPathDisposeHandle.cpp | 34 +++++++++++-------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/Windows API/RfGetFileSizeFromPathDisposeHandle.cpp b/Windows API/RfGetFileSizeFromPathDisposeHandle.cpp index 556ef6c..ea8ee0e 100644 --- a/Windows API/RfGetFileSizeFromPathDisposeHandle.cpp +++ b/Windows API/RfGetFileSizeFromPathDisposeHandle.cpp @@ -1,33 +1,37 @@ -DWORD RfGetFileSizeFromPathDisposeHandleW(PWCHAR Path, DWORD dwFlagsAndAttributes) +LONGLONG RfGetFileSizeFromPathDisposeHandleW(PWCHAR Path, DWORD dwFlagsAndAttributes) { - DWORD Size = ERROR_SUCCESS; + LARGE_INTEGER LargeInteger; HANDLE hHandle = INVALID_HANDLE_VALUE; hHandle = CreateFileW(Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL); if (hHandle == INVALID_HANDLE_VALUE) return INVALID_FILE_SIZE; - Size = GetFileSize(hHandle, NULL); + if (GetFileSizeEx(hHandle, &LargeInteger)) + { + if (hHandle) + CloseHandle(hHandle); + return LargeInteger.QuadPart; + } - if (hHandle) - CloseHandle(hHandle); - - return Size; + return INVALID_FILE_SIZE; } -DWORD RfGetFileSizeFromPathDisposeHandleA(PCHAR Path, DWORD dwFlagsAndAttributes) +LONGLONG RfGetFileSizeFromPathDisposeHandleA(PCHAR Path, DWORD dwFlagsAndAttributes) { - DWORD Size = ERROR_SUCCESS; + LARGE_INTEGER LargeInteger; HANDLE hHandle = INVALID_HANDLE_VALUE; hHandle = CreateFileA(Path, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, NULL, OPEN_EXISTING, dwFlagsAndAttributes, NULL); if (hHandle == INVALID_HANDLE_VALUE) return INVALID_FILE_SIZE; - Size = GetFileSize(hHandle, NULL); - - if (hHandle) - CloseHandle(hHandle); - - return Size; + if (GetFileSizeEx(hHandle, &LargeInteger)) + { + if (hHandle) + CloseHandle(hHandle); + return LargeInteger.QuadPart; + } + + return INVALID_FILE_SIZE; }