You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

216 lines
8.5 KiB

#ifndef MP4V2_PLATFORM_IO_FILESYSTEM_H
#define MP4V2_PLATFORM_IO_FILESYSTEM_H
namespace mp4v2 { namespace platform { namespace io {
///////////////////////////////////////////////////////////////////////////////
///
/// General file-system abstraction.
///
/// FileSystem abstracts operations on files and directories.
///
///////////////////////////////////////////////////////////////////////////////
class MP4V2_EXPORT FileSystem
{
public:
static string DIR_SEPARATOR; //!< separator string used in file pathnames
static string PATH_SEPARATOR; //!< separator string used in search-paths
///////////////////////////////////////////////////////////////////////////
//!
//! Query file presence.
//! Check if <b>name</b> exists.
//! @param name filename to query.
//! On Windows, this should be a UTF-8 encoded string.
//! On other platforms, it should be an 8-bit encoding that is
//! appropriate for the platform, locale, file system, etc.
//! (prefer to use UTF-8 when possible).
//! @return true if present, false otherwise.
//!
///////////////////////////////////////////////////////////////////////////
static bool exists( std::string name );
///////////////////////////////////////////////////////////////////////////
//!
//! Query directory type.
//! Check if <b>name</b> exists and is a directory.
//! @param name pathname to query.
//! On Windows, this should be a UTF-8 encoded string.
//! On other platforms, it should be an 8-bit encoding that is
//! appropriate for the platform, locale, file system, etc.
//! (prefer to use UTF-8 when possible).
//! @return true if directory, false otherwise.
//!
///////////////////////////////////////////////////////////////////////////
static bool isDirectory( std::string name );
///////////////////////////////////////////////////////////////////////////
//!
//! Query file type.
//! Check if <b>name</b> exists and is a file.
//! On Windows, this should be a UTF-8 encoded string.
//! On other platforms, it should be an 8-bit encoding that is
//! appropriate for the platform, locale, file system, etc.
//! (prefer to use UTF-8 when possible).
//! @param name filename to query.
//! @return true if file, false otherwise.
//!
///////////////////////////////////////////////////////////////////////////
static bool isFile( std::string name );
///////////////////////////////////////////////////////////////////////////
//!
//! Query file size.
//! Check if <b>name</b> exists and is a file.
//! @param name filename to query.
//! On Windows, this should be a UTF-8 encoded string.
//! On other platforms, it should be an 8-bit encoding that is
//! appropriate for the platform, locale, file system, etc.
//! (prefer to use UTF-8 when possible).
//! @param size output indicating file size in bytes.
//! @return true on failure, false on success.
//!
///////////////////////////////////////////////////////////////////////////
static bool getFileSize( std::string name, File::Size& size );
///////////////////////////////////////////////////////////////////////////
//!
//! Rename file or directory.
//!
//! Rename <b>oldname</b> to <b>newname</b>.
//! If <b>newname</b> exists, it is first removed.
//! Both <b>oldname</b> and <b>newname</b> must be of the same type;
//! that is, both must be either files or directories and must reside on
//! the same filesystem.
//!
//! @param oldname existing pathname to rename.
//! On Windows, this should be a UTF-8 encoded string.
//! On other platforms, it should be an 8-bit encoding that is
//! appropriate for the platform, locale, file system, etc.
//! (prefer to use UTF-8 when possible).
//! @param newname new pathname.
//! On Windows, this should be a UTF-8 encoded string.
//! On other platforms, it should be an 8-bit encoding that is
//! appropriate for the platform, locale, file system, etc.
//! (prefer to use UTF-8 when possible).
//!
//! @return true on failure, false on success.
//!
///////////////////////////////////////////////////////////////////////////
static bool rename( std::string oldname, std::string newname );
///////////////////////////////////////////////////////////////////////////
//!
//! Generate temporary pathname.
//!
//! @param name output containing generated pathname.
//! @param dir relative or absolute directory of pathname.
//! @param prefix text prepended to base pathname.
//! @param suffix text appended to base pathname.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameTemp( string& name, string dir = ".", string prefix = "tmp", string suffix = "" );
///////////////////////////////////////////////////////////////////////////
//!
//! Cleanup pathname.
//!
//! Redundant (repeating) directory-separators are folded into a single
//! directory-separator.
//!
//! Redundant /./ are folded into a single directory-separator.
//!
//! @param name pathname to modify.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameCleanup( string& name );
#if 0
TODO-KB: implement
///////////////////////////////////////////////////////////////////////////
//!
//! Remove everything after the last directory component.
//!
//! A pathname cleanup is always performed. See pathnameCleanup().
//! If no directory component is present then "." is assumed.
//!
//! @param name pathname to modify.
//! @param trailing when true all results are suffixed with exactly one
//! directory-separator, otherwise the result is guaranteed to not
//! end in a directory-separator.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameOnlyDirectory( string& name, bool trailing = true );
///////////////////////////////////////////////////////////////////////////
//!
//! Remove everything except the file component of pathname.
//!
//! A pathname cleanup is always performed. See pathnameCleanup().
//! If no file component exists then an empty-string is output.
//! A file component may include an extension.
//!
//! @param name pathname to modify.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameOnlyFile( string& name );
///////////////////////////////////////////////////////////////////////////
//!
//! Remove everything except file basename.
//!
//! A pathname cleanup is always performed. See pathnameCleanup().
//! A basename is considered to be everything before the last '.'
//! in the file component of a pathname.
//! If no file extension exists then an empty-string is output.
//!
//! @param name pathname to modify.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameOnlyBasename( string& name );
#endif
///////////////////////////////////////////////////////////////////////////
//!
//! Remove everything except file extension.
//!
//! A pathname cleanup is always performed. See pathnameCleanup().
//! A file extension is considered to everything <b>after</b>
//! the last '.' in the file component of a pathname.
//! If no file extension exists then an empty-string is output.
//!
//! @param name pathname to modify.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameOnlyExtension( string& name );
///////////////////////////////////////////////////////////////////////////
//!
//! Remove file extension from pathname.
//!
//! A pathname cleanup is always performed. See pathnameCleanup().
//! A file extension is considered to everything <b>after</b>
//! the last '.' in the file component of a pathname.
//! The last '.' is also removed.
//!
//! @param name pathname to modify.
//!
///////////////////////////////////////////////////////////////////////////
static void pathnameStripExtension( string& name );
};
///////////////////////////////////////////////////////////////////////////////
}}} // namespace mp4v2::platform::io
#endif // MP4V2_PLATFORM_IO_FILESYSTEM_H