#ifndef FILENAME_H
#define FILENAME_H
-#include "strfwd.h"
+#include "support/strfwd.h"
-#include <string>
#include <ctime>
namespace lyx {
namespace support {
+/// Defined in "FileNameList.h".
+class FileNameList;
/**
* Class for storing file names.
class FileName {
public:
/// Constructor for empty filenames
- FileName() {}
+ FileName();
/** Constructor for nonempty filenames.
* explicit because we don't want implicit conversion of relative
* paths in function arguments (e.g. of unlink).
* Encoding is always UTF-8.
*/
explicit FileName(std::string const & abs_filename);
- virtual ~FileName() {}
+
+ /// copy constructor.
+ FileName(FileName const &);
+
+ ///
+ FileName & operator=(FileName const &);
+
+ virtual ~FileName();
/** Set a new filename.
* \param filename the file in question. Must have an absolute path.
* Encoding is always UTF-8.
virtual void set(std::string const & filename);
virtual void erase();
/// Is this filename empty?
- bool empty() const { return name_.empty(); }
+ bool empty() const;
+ /// Is the filename absolute?
+ bool isAbsolute() const;
+
/// get the absolute file name in UTF-8 encoding
- std::string const absFilename() const { return name_; }
+ std::string absFilename() const;
/**
* Get the file name in the encoding used by the file system.
* Only use this for accessing the file, e.g. with an fstream.
bool isFileEmpty() const;
/// returns time of last write access
std::time_t lastModified() const;
+ /// generates a checksum of a file
+ unsigned long checksum() const;
/// return true when file is readable but not writabel
bool isReadOnly() const;
/// return true when it names a directory
bool isWritable() const;
/// return true when file/directory is writable (write test file)
bool isDirWritable() const;
+ /// \return list other files in the directory having optional extension 'ext'.
+ FileNameList dirList(std::string const & ext) const;
- /// return true when file/directory is writable (write test file)
- bool copyTo(FileName const & target, bool noclobber) const;
+ /// copy a file
+ /// \return true when file/directory is writable (write test file)
+ /// \warning This methods has different semantics when system level
+ /// copy command, it will overwrite the \c target file if it exists,
+ bool copyTo(FileName const & target) const;
+
+ /// remove pointed file.
+ /// \return true on success.
+ bool removeFile() const;
+
+ /// rename pointed file.
+ /// \return false if the operation fails or if the \param target file
+ /// already exists.
+ /// \return true on success.
+ bool renameTo(FileName const & target) const;
+
+ /// move pointed file to \param target.
+ /// \return true on success.
+ bool moveTo(FileName const & target) const;
+
+ /// change mode of pointed file.
+ /// This methods does nothing and return true on platforms that does not
+ /// support this.
+ /// \return true on success.
+ bool changePermission(unsigned long int mode) const;
- /// remove directory and all contents, returns true on success
+ /// remove pointed directory and all contents.
+ /// \return true on success.
bool destroyDirectory() const;
- /// Creates directory. Returns true on success
+ /// Creates pointed directory.
+ /// \return true on success.
bool createDirectory(int permissions) const;
+ /// Creates pointed path.
+ /// \return true on success.
+ bool createPath() const;
- /// Get the contents of a file as a huge std::string
- std::string fileContents() const;
+ /// Get the contents of a file as a huge docstring.
+ /// \param encoding defines the encoding of the file contents.
+ /// Only four encodings are supported:
+ /// "UTF-8", "ascii", "latin1" and "local8bit" which uses the
+ /// current system locale.
+ docstring fileContents(std::string const & encoding) const;
+
+ /// Change extension.
/**
- * Get a FileName from \p name in the encoding used by the file system.
- * Only use this for filenames you got directly from the file system,
- * e.g. from reading a directory.
- * \p name must have an absolute path.
- */
+ * If oldname does not have an extension, it is appended.
+ * If the extension is empty, any extension is removed from the name.
+ */
+ void changeExtension(std::string const & extension);
/** Guess the file format name (as in Format::name()) from contents.
Normally you don't want to use this directly, but rather
bool isZippedFile() const;
static FileName fromFilesystemEncoding(std::string const & name);
- /// (securely) create a temporary file in the given dir with the given mask
- /// \p mask must be in filesystem encoding
- static FileName tempName(FileName const & dir = FileName(),
- std::string const & mask = std::string());
+ /// (securely) create a temporary file with the given mask.
+ /// \p mask must be in filesystem encoding, if it contains a
+ /// relative path, the template file will be created in the global
+ /// temporary directory as given by 'package().temp_dir()'.
+ static FileName tempName(std::string const & mask = empty_string());
+
+ /// get the current working directory
+ static FileName getcwd();
/// filename without path
std::string onlyFileName() const;
/// used for display in the Gui
docstring displayName(int threshold = 1000) const;
+ /// change to a directory, return success
+ bool chdir() const;
+
+ /// \param buffer_path if empty, uses `pwd`
+ docstring const relPath(std::string const & path) const;
+
+ docstring const absoluteFilePath() const;
-protected:
- /// The absolute file name in UTF-8 encoding.
- std::string name_;
+private:
+ ///
+ struct Private;
+ Private * const d;
};
bool saveAbsPath() const { return save_abs_path_; }
/// \param buffer_path if empty, uses `pwd`
- std::string const relFilename(std::string const & buffer_path = std::string()) const;
+ std::string relFilename(std::string const & buffer_path = empty_string()) const;
/// \param buf_path if empty, uses `pwd`
- std::string const outputFilename(std::string const & buf_path = std::string()) const;
+ std::string outputFilename(std::string const & buf_path = empty_string()) const;
/** @returns a mangled representation of the absolute file name
* suitable for use in the temp dir when, for example, converting
* Only the mangled file name is returned. It is not prepended
* with @c dir.
*/
- std::string const
- mangledFilename(std::string const & dir = std::string()) const;
+ std::string
+ mangledFilename(std::string const & dir = empty_string()) const;
/// \return true if the file is compressed.
bool isZipped() const;
/// \return the absolute file name without its .gz, .z, .Z extension
- std::string const unzippedFilename() const;
+ std::string unzippedFilename() const;
private:
bool save_abs_path_;
bool operator==(DocFileName const &, DocFileName const &);
bool operator!=(DocFileName const &, DocFileName const &);
-
} // namespace support
} // namespace lyx