diff --git a/aegisub/libaegisub/include/libaegisub/util.h b/aegisub/libaegisub/include/libaegisub/util.h index 55c21dec7269bb92cd5adae6f39fb145f206da49..8e9d73596c8851bd3c95474eea567fed63790a94 100644 --- a/aegisub/libaegisub/include/libaegisub/util.h +++ b/aegisub/libaegisub/include/libaegisub/util.h @@ -65,7 +65,7 @@ namespace agi { /// Check for amount of free space on a Path. // @param path[in] Path to check // @param type PathType (default is TypeDir) - uint64_t freespace(std::string &path, PathType type=TypeDir); + uint64_t freespace(std::string const& path, PathType type=TypeDir); struct delete_ptr { template<class T> diff --git a/aegisub/libaegisub/unix/util.cpp b/aegisub/libaegisub/unix/util.cpp index c9215bf81470fb7edf42a77242aa3a7298923d59..50708f268756a1f0aa491b03aac8c360faa598c7 100644 --- a/aegisub/libaegisub/unix/util.cpp +++ b/aegisub/libaegisub/unix/util.cpp @@ -66,7 +66,7 @@ void time_log(timeval &tv) { gettimeofday(&tv, (struct timezone *)NULL); } -uint64_t freespace(std::string &path, PathType type) { +uint64_t freespace(std::string const& path, PathType type) { struct statvfs fs; std::string check(path); diff --git a/aegisub/libaegisub/windows/util_win.cpp b/aegisub/libaegisub/windows/util_win.cpp index 43751875156b76cfbd3a90a1ebb51bd4434154d6..5fe1f3d0c084cc5b2925389d15459569dd4cf615 100644 --- a/aegisub/libaegisub/windows/util_win.cpp +++ b/aegisub/libaegisub/windows/util_win.cpp @@ -111,5 +111,19 @@ void time_log(agi_timeval &tv) { tv.tv_usec = (long)(tmpres % 1000000UL); } +uint64_t freespace(std::string const& path, PathType type) { + if (type == TypeFile) + return freespace(DirName(path)); + + ULARGE_INTEGER bytes_available; + if (GetDiskFreeSpaceEx(ConvertW(path).c_str(), &bytes_available, 0, 0)) + return bytes_available.QuadPart; + + acs::CheckDirRead(path); + + /// @todo GetLastError -> Exception mapping + throw "Unknown error getting free space"; +} + } // namespace io } // namespace agi