diff --git a/aegisub/libaegisub/common/fs.cpp b/aegisub/libaegisub/common/fs.cpp index 26c1a99c4..599046778 100644 --- a/aegisub/libaegisub/common/fs.cpp +++ b/aegisub/libaegisub/common/fs.cpp @@ -23,7 +23,9 @@ #include "libaegisub/log.h" #include +#define BOOST_NO_SCOPED_ENUMS #include +#undef BOOST_NO_SCOPED_ENUMS namespace bfs = boost::filesystem; namespace ec = boost::system::errc; @@ -94,11 +96,6 @@ namespace agi { namespace fs { CHECKED_CALL(bfs::rename(from, to, ec), from, to); } - void Copy(path const& from, path const& to) { - CreateDirectory(to.parent_path()); - CHECKED_CALL(bfs::copy_file(from, to, bfs::copy_option::overwrite_if_exists, ec), from, to); - } - bool HasExtension(path const& p, std::string const& ext) { auto filename = p.filename().string(); if (filename.size() < ext.size() + 1) return false; diff --git a/aegisub/libaegisub/lagi_pre.h b/aegisub/libaegisub/lagi_pre.h index 16776817b..044eedac1 100644 --- a/aegisub/libaegisub/lagi_pre.h +++ b/aegisub/libaegisub/lagi_pre.h @@ -61,6 +61,9 @@ // Boost #include #include +#define BOOST_NO_SCOPED_ENUMS +#include +#undef BOOST_NO_SCOPED_ENUMS #ifdef __DEPRECATED // Dodge GCC warnings # undef __DEPRECATED diff --git a/aegisub/libaegisub/unix/fs.cpp b/aegisub/libaegisub/unix/fs.cpp index 63c22450e..6c59766a2 100644 --- a/aegisub/libaegisub/unix/fs.cpp +++ b/aegisub/libaegisub/unix/fs.cpp @@ -16,7 +16,9 @@ #include "config.h" +#include "libaegisub/access.h" #include "libaegisub/fs.h" +#include "libaegisub/io.h" #include #include @@ -40,6 +42,15 @@ void Touch(path const& file) { } } +void Copy(fs::path const& from, fs::path const& to) { + acs::CheckFileRead(from); + CreateDirectory(to.parent_path()); + acs::CheckDirWrite(to.parent_path()); + + std::unique_ptr in(io::Open(from, true)); + io::Save(to).Get() << in->rdbuf(); +} + struct DirectoryIterator::PrivData { boost::system::error_code ec; bfs::directory_iterator it; diff --git a/aegisub/libaegisub/windows/fs.cpp b/aegisub/libaegisub/windows/fs.cpp index 57c29d10f..b0a8d5cdd 100644 --- a/aegisub/libaegisub/windows/fs.cpp +++ b/aegisub/libaegisub/windows/fs.cpp @@ -72,6 +72,23 @@ void Touch(path const& file) { throw EnvironmentError("SetFileTime failed with error: " + util::ErrorString(GetLastError())); } +void Copy(fs::path const& from, fs::path const& to) { + acs::CheckFileRead(from); + CreateDirectory(to.parent_path()); + acs::CheckDirWrite(to.parent_path()); + + if (!CopyFile(from.wstring().c_str(), to.wstring().c_str(), false)) { + switch (GetLastError()) { + case ERROR_FILE_NOT_FOUND: + throw FileNotFound(from); + case ERROR_ACCESS_DENIED: + throw fs::WriteDenied("Could not overwrite " + to.string()); + default: + throw fs::WriteDenied("Could not copy: " + util::ErrorString(GetLastError())); + } + } +} + struct DirectoryIterator::PrivData { scoped_holder h; PrivData() : h(INVALID_HANDLE_VALUE, FindClose) { }