X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fpbd%2Ffilesystem.cc;h=661e21cbd5074bf971fb5e5b12c9225ede2912c0;hb=31e203ac07cbda216fc842c68b9192d082ba8d65;hp=aefe6d525cf22635853a0d398f97a8ded17cd803;hpb=29842063e312e804e748f2160a90ccc35be63311;p=ardour.git diff --git a/libs/pbd/filesystem.cc b/libs/pbd/filesystem.cc index aefe6d525c..661e21cbd5 100644 --- a/libs/pbd/filesystem.cc +++ b/libs/pbd/filesystem.cc @@ -21,13 +21,21 @@ #include #include +#include + #include +#include #include #include -#include -#include +#include "pbd/filesystem.h" +#include "pbd/error.h" +#include "pbd/compose.h" + +#include "i18n.h" + +using namespace std; namespace PBD { @@ -54,12 +62,60 @@ path::operator/=(const char* rhs) return *this; } +string +path::leaf () const +{ + return Glib::path_get_basename(m_path); +} + +path +path::branch_path () const +{ + string dir = Glib::path_get_dirname (m_path); + + /* + * glib returns "." to signify that the path + * has no directory components(branch path) + * whereas boost::filesystem returns an empty + * string + */ + if(dir == ".") + { + return ""; + } + return dir; +} + bool exists (const path & p) { return Glib::file_test (p.to_string(), Glib::FILE_TEST_EXISTS); } +bool +exists_and_writable (const path & p) +{ + /* writable() really reflects the whole folder, but if for any + reason the session state file can't be written to, still + make us unwritable. + */ + + struct stat statbuf; + + if (g_stat (p.to_string().c_str(), &statbuf) != 0) { + /* doesn't exist - not writable */ + return false; + } else { + if (!(statbuf.st_mode & S_IWUSR)) { + /* exists and is not writable */ + return false; + } + } + + return true; +} + + bool is_directory (const path & p) { @@ -108,11 +164,72 @@ 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) +{ + 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) { + remove (to_path); + throw filesystem_error(string_compose(_("Could not copy existing file %1 to %2"), + from_path.to_string(), to_path.to_string())); + } +} + string basename (const path & p) { - // I'm not sure if this works quite the same as boost::filesystem::basename - return Glib::path_get_basename (p.to_string ()); + string base(p.leaf()); + + string::size_type n = base.rfind ('.'); + + return base.substr (0, n); +} + +string +extension (const path & p) +{ + string base(p.leaf()); + + string::size_type n = base.rfind ('.'); + + if (n != string::npos) + { + return base.substr(n); + } + + return string(); + +} + +/** Take a (possibly) relative path and make it absolute */ +path +get_absolute_path (const path & p) +{ + Glib::RefPtr f = Gio::File::create_for_path (p.to_string ()); + return f->get_path (); } } // namespace sys