summaryrefslogtreecommitdiff
path: root/libs/pbd
diff options
context:
space:
mode:
authorTim Mayberry <mojofunk@gmail.com>2007-09-04 04:48:13 +0000
committerTim Mayberry <mojofunk@gmail.com>2007-09-04 04:48:13 +0000
commite3364b72cce555a699660be1f0e69faf3c22892e (patch)
treec54417b107b3709017d74e25d2d4a4354f39ed18 /libs/pbd
parent653a552da503f3d9e250958998868c2021bef823 (diff)
Add function PBD::sys::copy_file intended to replace PBD::copy_file
Basically moving PBD::copy_file implementation to pbd/filesystem.h/cc. The implementation itself looks like it could be improved to use much less memory when copying big files by reading and writing in chunks but I don't think that is an issue at present. git-svn-id: svn://localhost/ardour2/trunk@2376 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd')
-rw-r--r--libs/pbd/filesystem.cc26
-rw-r--r--libs/pbd/pbd/filesystem.h10
2 files changed, 36 insertions, 0 deletions
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 <glib/gstdio.h>
#include <cerrno>
+#include <fstream>
#include <glibmm/fileutils.h>
#include <glibmm/miscutils.h>
#include <pbd/filesystem.h>
#include <pbd/error.h>
+#include <pbd/compose.h>
+
+#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