X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Ffilesystem.cc;h=84d18cfcd242fc45b54b4bccc620ee7c7a1c6de2;hb=d9416a3a6a69a975bb8f1aae50d218e4f71d2f19;hp=3c96f5b0019e48378b5cf43857b27639a8584b3f;hpb=8b160ef5000f7160bfcb993e2c478c64d784c085;p=ardour.git diff --git a/libs/pbd/filesystem.cc b/libs/pbd/filesystem.cc index 3c96f5b001..84d18cfcd2 100644 --- a/libs/pbd/filesystem.cc +++ b/libs/pbd/filesystem.cc @@ -58,6 +58,12 @@ path::operator/=(const char* rhs) return *this; } +string +path::leaf () const +{ + return Glib::path_get_basename(m_path); +} + path path::branch_path () const { @@ -130,11 +136,23 @@ remove(const path & p) return true; } +void +rename (const path & from_path, const path & to_path) +{ + // g_rename is a macro that evaluates to ::rename on + // POSIX systems, without the global namespace qualifier + // it would evaluate to a recursive call(if it compiled) + if ( ::g_rename( from_path.to_string().c_str(), + to_path.to_string().c_str() ) == -1 ) + { + throw filesystem_error(g_strerror(errno), errno); + } +} + +// XXX character encoding. 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()); @@ -146,16 +164,16 @@ copy_file(const path & from_path, const path & to_path) out << in.rdbuf(); if (!in || !out) { + remove (to_path); 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) { - string base = Glib::path_get_basename (p.to_string()); + string base(p.leaf()); string::size_type n = base.rfind ('.'); @@ -165,7 +183,7 @@ basename (const path & p) string extension (const path & p) { - string base = Glib::path_get_basename (p.to_string()); + string base(p.leaf()); string::size_type n = base.rfind ('.');