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