Remove use of copy_file from boost.filesystem

copy_file's signature varies depending on whether or not boost was
compiled as C++11, which makes Linux packaging awkward.

Closes #1580. Closes #1581.
This commit is contained in:
Thomas Goyne 2013-05-05 07:54:33 -07:00
parent 6e62f9e461
commit 2db687cc31
4 changed files with 33 additions and 5 deletions

View file

@ -23,7 +23,9 @@
#include "libaegisub/log.h" #include "libaegisub/log.h"
#include <boost/algorithm/string/predicate.hpp> #include <boost/algorithm/string/predicate.hpp>
#define BOOST_NO_SCOPED_ENUMS
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#undef BOOST_NO_SCOPED_ENUMS
namespace bfs = boost::filesystem; namespace bfs = boost::filesystem;
namespace ec = boost::system::errc; namespace ec = boost::system::errc;
@ -94,11 +96,6 @@ namespace agi { namespace fs {
CHECKED_CALL(bfs::rename(from, to, ec), from, to); 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) { bool HasExtension(path const& p, std::string const& ext) {
auto filename = p.filename().string(); auto filename = p.filename().string();
if (filename.size() < ext.size() + 1) return false; if (filename.size() < ext.size() + 1) return false;

View file

@ -61,6 +61,9 @@
// Boost // Boost
#include <boost/container/list.hpp> #include <boost/container/list.hpp>
#include <boost/container/map.hpp> #include <boost/container/map.hpp>
#define BOOST_NO_SCOPED_ENUMS
#include <boost/filesystem.hpp>
#undef BOOST_NO_SCOPED_ENUMS
#ifdef __DEPRECATED // Dodge GCC warnings #ifdef __DEPRECATED // Dodge GCC warnings
# undef __DEPRECATED # undef __DEPRECATED

View file

@ -16,7 +16,9 @@
#include "config.h" #include "config.h"
#include "libaegisub/access.h"
#include "libaegisub/fs.h" #include "libaegisub/fs.h"
#include "libaegisub/io.h"
#include <boost/filesystem.hpp> #include <boost/filesystem.hpp>
#include <fcntl.h> #include <fcntl.h>
@ -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<std::istream> in(io::Open(from, true));
io::Save(to).Get() << in->rdbuf();
}
struct DirectoryIterator::PrivData { struct DirectoryIterator::PrivData {
boost::system::error_code ec; boost::system::error_code ec;
bfs::directory_iterator it; bfs::directory_iterator it;

View file

@ -72,6 +72,23 @@ void Touch(path const& file) {
throw EnvironmentError("SetFileTime failed with error: " + util::ErrorString(GetLastError())); 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 { struct DirectoryIterator::PrivData {
scoped_holder<HANDLE, BOOL (__stdcall *)(HANDLE)> h; scoped_holder<HANDLE, BOOL (__stdcall *)(HANDLE)> h;
PrivData() : h(INVALID_HANDLE_VALUE, FindClose) { } PrivData() : h(INVALID_HANDLE_VALUE, FindClose) { }