Skip to content

Commit

Permalink
Use GetFileSize instead of GetFileSizeEx on Windows
Browse files Browse the repository at this point in the history
  • Loading branch information
vitaut committed Mar 16, 2015
1 parent c6d3a73 commit 5aecd49
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 12 deletions.
18 changes: 12 additions & 6 deletions posix.cc
Original file line number Diff line number Diff line change
Expand Up @@ -140,13 +140,19 @@ void fmt::File::close() {

fmt::LongLong fmt::File::size() const {
#ifdef _WIN32
LARGE_INTEGER filesize = {};
// Use GetFileSize instead of GetFileSizeEx for the case when _WIN32_WINNT
// is less than 0x0500 as is the case with some default MinGW builds.
// Both functions support large file sizes.
DWORD size_upper = 0;
HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));
if (!FMT_SYSTEM(GetFileSizeEx(handle, &filesize)))
throw WindowsError(GetLastError(), "cannot get file size");
FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(filesize.QuadPart),
"return type of File::size is not large enough");
return filesize.QuadPart;
DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper));
if (size_lower == INVALID_FILE_SIZE) {
DWORD error = GetLastError();
if (error != NO_ERROR)
throw WindowsError(GetLastError(), "cannot get file size");
}
fmt::ULongLong size = size_upper;
return (size << sizeof(DWORD) * CHAR_BIT) | size_lower;
#else
typedef struct stat Stat;
Stat file_stat = Stat();
Expand Down
12 changes: 7 additions & 5 deletions test/posix-test.cc
Original file line number Diff line number Diff line change
Expand Up @@ -105,15 +105,17 @@ errno_t test::sopen_s(

static LONGLONG max_file_size() { return std::numeric_limits<LONGLONG>::max(); }

BOOL test::GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize) {
DWORD test::GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh) {
if (fstat_sim == ERROR) {
SetLastError(ERROR_ACCESS_DENIED);
return FALSE;
}
BOOL result = ::GetFileSizeEx(hFile, lpFileSize);
if (fstat_sim == MAX_SIZE)
lpFileSize->QuadPart = max_file_size();
return result;
if (fstat_sim == MAX_SIZE) {
DWORD max = std::numeric_limits<DWORD>::max();
*lpFileSizeHig = max >> 1;
return max;
}
return ::GetFileSize(hFile, lpFileSizeHigh);
}
#endif

Expand Down
2 changes: 1 addition & 1 deletion test/posix-test.h
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ typedef unsigned size_t;
typedef int ssize_t;
errno_t sopen_s(
int* pfh, const char *filename, int oflag, int shflag, int pmode);
BOOL GetFileSizeEx(HANDLE hFile, PLARGE_INTEGER lpFileSize);
DWORD GetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
#endif

int close(int fildes);
Expand Down

0 comments on commit 5aecd49

Please sign in to comment.