diff --git a/include/spdlog/details/file_helper.h b/include/spdlog/details/file_helper.h index 4c5fe237..c5923358 100644 --- a/include/spdlog/details/file_helper.h +++ b/include/spdlog/details/file_helper.h @@ -96,24 +96,13 @@ public: std::fflush(_fd); } - long size() + size_t size() { if (!_fd) throw spdlog_ex("Cannot use size() on closed file " + os::filename_to_str(_filename)); - auto pos = ftell(_fd); - if (fseek(_fd, 0, SEEK_END) != 0) - throw spdlog_ex("fseek failed on file " + os::filename_to_str(_filename), errno); - - auto file_size = ftell(_fd); - - if(fseek(_fd, pos, SEEK_SET) !=0) - throw spdlog_ex("fseek failed on file " + os::filename_to_str(_filename), errno); - - if (file_size == -1) - throw spdlog_ex("ftell failed on file " + os::filename_to_str(_filename), errno); - - return file_size; + return os::filesize(_fd); + } const filename_t& filename() const diff --git a/include/spdlog/details/os.h b/include/spdlog/details/os.h index 384477da..d2f7e5c8 100644 --- a/include/spdlog/details/os.h +++ b/include/spdlog/details/os.h @@ -10,7 +10,10 @@ #include #include #include +#include #include +#include + #ifdef _WIN32 @@ -27,10 +30,11 @@ #include #endif +#include + #elif __linux__ #include //Use gettid() syscall under linux to get thread id -#include #include #include @@ -182,6 +186,48 @@ inline bool file_exists(const filename_t& filename) #endif } +//Return file size according to open FILE* object +inline size_t filesize(FILE *f) +{ +#ifdef _WIN32 +#if _WIN64 //64 bits + int fd = _fileno(f); + struct _stat64 st; + if (_fstat64(fd, &st) == 0) + return st.st_size; + else + throw spdlog_ex("Failed getting file size from fd", errno); +#else //windows 32 bits + int fd = _fileno(f); + struct _stat st; + if (_fstat(fd, &st) == 0) + return st.st_size; + else + throw spdlog_ex("Failed getting file size from fd", errno); +#endif + +#else// common unix + #if __x86_64__ || __ppc64__ //64 bits + int fd = fileno(f) + struct stat64 st; + if (fstat64(fd, &st) == 0) + return st.st_size; + else + throw spdlog_ex("Failed getting file size from fd", errno); +#else //unix 32 bits + int fd = fileno(f) + struct stat st; + if (fstat(fd, &st) == 0) + return st.st_size; + else + throw spdlog_ex("Failed getting file size from fd", errno); +#endif +#endif +} + + + + //Return utc offset in minutes or throw spdlog_ex on failure inline int utc_minutes_offset(const std::tm& tm = details::os::localtime()) { diff --git a/tests/file_helper.cpp b/tests/file_helper.cpp index e59cb88d..54d54cf1 100644 --- a/tests/file_helper.cpp +++ b/tests/file_helper.cpp @@ -63,7 +63,7 @@ TEST_CASE("file_helper_reopen", "[file_helper::reopen()]]") TEST_CASE("file_helper_reopen2", "[file_helper::reopen(false)]]") { prepare_logdir(); - auto expected_size = 14; + size_t expected_size = 14; file_helper helper(true); helper.open(target_filename); write_with_helper(helper, expected_size);