#include "support/strfwd.h"
#include <ctime>
+#include <set>
namespace lyx {
* \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 set(FileName const & fn, std::string const & suffix);
+ void set(std::string const & filename);
+ void set(FileName const & fn, std::string const & suffix);
virtual void erase();
/// Is this filename empty?
bool empty() const;
bool isDirWritable() const;
/// \return list other files in the directory having optional extension 'ext'.
FileNameList dirList(std::string const & ext) 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;
+ /// If \p keepsymlink is true, the copy will be written to the symlink
+ /// target. Otherwise, the symlink will be destroyed.
+ bool copyTo(FileName const & target, bool keepsymlink = false) const;
/// remove pointed file.
/// \return true on success.
bool renameTo(FileName const & target) const;
/// move pointed file to \param target.
+ /// If \p target exists it will be overwritten (if it is a symlink,
+ /// the symlink will be destroyed).
/// \return true on success.
bool moveTo(FileName const & target) const;
+ bool link(FileName const & name) 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;
+ // sets permission based on the file given as an argument
+ bool clonePermissions(FileName const & source);
/// remove pointed directory and all contents.
/// \return true on success.
*/
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
- Formats::getFormatFromFile().
- */
- std::string guessFormatFromContents() const;
-
static FileName fromFilesystemEncoding(std::string const & name);
- /// (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());
- static FileName tempName(FileName const & temp_dir,
- std::string const & mask);
/// get the current working directory
static FileName getcwd();
bool hasExtension(const std::string & ext);
/// path without file name
FileName onlyPath() const;
+ /// path of parent directory
+ /// returns empty path for root directory
+ FileName parentPath() 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;
private:
friend bool equivalent(FileName const &, FileName const &);
+ /// Set for tracking of already visited file names.
+ /// Uses operator==() (which may be case insensitive), and not
+ /// equivalent(), so that symlinks are not resolved.
+ typedef std::set<FileName> FileNameSet;
+ /// Helper for public copyTo() to find circular symlink chains
+ bool copyTo(FileName const &, bool, FileNameSet &) const;
///
struct Private;
Private * const d;
* \param buffer_path if \c filename has a relative path, generate
* the absolute path using this.
*/
- virtual void set(std::string const & filename, std::string const & buffer_path);
+ void set(std::string const & filename, std::string const & buffer_path);
///
- void erase();
+ void erase() override;
///
bool saveAbsPath() const { return save_abs_path_; }
/// \param buffer_path if empty, uses `pwd`
std::string relFileName(std::string const & buffer_path = empty_string()) const;
/// \param buf_path if empty, uses `pwd`
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
* an image file to another format.
std::string
mangledFileName(std::string const & dir = empty_string()) const;
+ /** Identical to mangledFileName, with the following additions:
+ *
+ * @encrypt_path allows using hash (SHA-256) instead of full path.
+ * @use_counter allows disabling the counter in the filename.
+ */
+ std::string
+ mangledFileName(std::string const & dir, bool use_counter, bool encrypt_path) const;
+
/// \return the absolute file name without its .gz, .z, .Z extension
std::string unzippedFileName() const;
};
-/// \return true if these have the same absolute path name AND
+/// \return true if these have the same absolute path name AND
/// if save_abs_path_ has the same value in both cases.
bool operator==(DocFileName const &, DocFileName const &);
///