mirror of
https://github.com/fmtlib/fmt.git
synced 2024-12-25 15:21:54 +00:00
Use GetFileSize instead of GetFileSizeEx on Windows
This commit is contained in:
parent
c6d3a73201
commit
5aecd4947f
18
posix.cc
18
posix.cc
@ -140,13 +140,19 @@ void fmt::File::close() {
|
|||||||
|
|
||||||
fmt::LongLong fmt::File::size() const {
|
fmt::LongLong fmt::File::size() const {
|
||||||
#ifdef _WIN32
|
#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_));
|
HANDLE handle = reinterpret_cast<HANDLE>(_get_osfhandle(fd_));
|
||||||
if (!FMT_SYSTEM(GetFileSizeEx(handle, &filesize)))
|
DWORD size_lower = FMT_SYSTEM(GetFileSize(handle, &size_upper));
|
||||||
throw WindowsError(GetLastError(), "cannot get file size");
|
if (size_lower == INVALID_FILE_SIZE) {
|
||||||
FMT_STATIC_ASSERT(sizeof(fmt::LongLong) >= sizeof(filesize.QuadPart),
|
DWORD error = GetLastError();
|
||||||
"return type of File::size is not large enough");
|
if (error != NO_ERROR)
|
||||||
return filesize.QuadPart;
|
throw WindowsError(GetLastError(), "cannot get file size");
|
||||||
|
}
|
||||||
|
fmt::ULongLong size = size_upper;
|
||||||
|
return (size << sizeof(DWORD) * CHAR_BIT) | size_lower;
|
||||||
#else
|
#else
|
||||||
typedef struct stat Stat;
|
typedef struct stat Stat;
|
||||||
Stat file_stat = Stat();
|
Stat file_stat = Stat();
|
||||||
|
@ -105,15 +105,17 @@ errno_t test::sopen_s(
|
|||||||
|
|
||||||
static LONGLONG max_file_size() { return std::numeric_limits<LONGLONG>::max(); }
|
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) {
|
if (fstat_sim == ERROR) {
|
||||||
SetLastError(ERROR_ACCESS_DENIED);
|
SetLastError(ERROR_ACCESS_DENIED);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
BOOL result = ::GetFileSizeEx(hFile, lpFileSize);
|
if (fstat_sim == MAX_SIZE) {
|
||||||
if (fstat_sim == MAX_SIZE)
|
DWORD max = std::numeric_limits<DWORD>::max();
|
||||||
lpFileSize->QuadPart = max_file_size();
|
*lpFileSizeHig = max >> 1;
|
||||||
return result;
|
return max;
|
||||||
|
}
|
||||||
|
return ::GetFileSize(hFile, lpFileSizeHigh);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -51,7 +51,7 @@ typedef unsigned size_t;
|
|||||||
typedef int ssize_t;
|
typedef int ssize_t;
|
||||||
errno_t sopen_s(
|
errno_t sopen_s(
|
||||||
int* pfh, const char *filename, int oflag, int shflag, int pmode);
|
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
|
#endif
|
||||||
|
|
||||||
int close(int fildes);
|
int close(int fildes);
|
||||||
|
Loading…
Reference in New Issue
Block a user