diff --git a/libs/pbd/filesystem.cc b/libs/pbd/filesystem.cc index aefe6d525c..2412b76761 100644 --- a/libs/pbd/filesystem.cc +++ b/libs/pbd/filesystem.cc @@ -22,12 +22,16 @@ #include #include +#include #include #include #include #include +#include + +#include "i18n.h" namespace PBD { @@ -108,6 +112,28 @@ remove(const path & p) return true; } +void +copy_file(const path & from_path, const path & to_path) +{ + // this implementation could use mucho memory + // for big files. + std::ifstream in(from_path.to_string().c_str()); + std::ofstream out(to_path.to_string().c_str()); + + if (!in || !out) { + throw filesystem_error(string_compose(_("Could not open files %1 and %2 for copying"), + from_path.to_string(), to_path.to_string())); + } + + out << in.rdbuf(); + + if (!in || !out) { + throw filesystem_error(string_compose(_("Could not copy existing file %1 to %2"), + from_path.to_string(), to_path.to_string())); + remove (to_path); + } +} + string basename (const path & p) { diff --git a/libs/pbd/pbd/filesystem.h b/libs/pbd/pbd/filesystem.h index 7eca8a7ed3..3ea009649d 100644 --- a/libs/pbd/pbd/filesystem.h +++ b/libs/pbd/pbd/filesystem.h @@ -106,6 +106,16 @@ bool create_directories(const path & p); */ bool remove(const path & p); +/** + * Attempt to copy the contents of the file from_path to a new file + * at path to_path. + * + * @throw filesystem_error if from_path.empty() || to_path.empty() || + * !exists(from_path) || !is_regular(from_path) || exists(to_path) + */ +void copy_file(const path & from_path, const path & to_path); + + string basename (const path& p); } // namespace sys