Add function PBD::sys::copy_file intended to replace PBD::copy_file
authorTim Mayberry <mojofunk@gmail.com>
Tue, 4 Sep 2007 04:48:13 +0000 (04:48 +0000)
committerTim Mayberry <mojofunk@gmail.com>
Tue, 4 Sep 2007 04:48:13 +0000 (04:48 +0000)
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

libs/pbd/filesystem.cc
libs/pbd/pbd/filesystem.h

index aefe6d525cf22635853a0d398f97a8ded17cd803..2412b7676119db816139107a6185c45da3befff7 100644 (file)
 #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)
 {
index 7eca8a7ed35eed309ef67ed2a8a03e8286dd6706..3ea009649d0ff9ad600f6802fc4d9d2e0315ad66 100644 (file)
@@ -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