#ifndef FILENAME_H
#define FILENAME_H
+#include "support/os.h"
#include "support/strfwd.h"
#include <ctime>
static bool isAbsolute(std::string const & name);
/// get the absolute file name in UTF-8 encoding
- std::string absFilename() const;
+ std::string absFileName() const;
/** returns an absolute pathname (whose resolution does not involve
* '.', '..', or symbolic links) in UTF-8 encoding
/**
* Get the file name in the encoding used by the file system.
- * Only use this for accessing the file, e.g. with an fstream.
+ * Only use this for passing file names to external commands.
+ * Warning: On Windows this is not unicode safe and should not
+ * be used for accessing files with an fstream, for example.
*/
std::string toFilesystemEncoding() const;
+ /**
+ * Get the file name in a unicode safe encoding used by the file system.
+ * Only use this for accessing the file with standard I/O functions
+ * non explicitly unicode aware, e.g. with an fstream. This can also
+ * be used for passing file names to external commands, but only if
+ * you are sure that the stem of the name will not be used for
+ * producing derivative files. For example, don't use this for passing
+ * file names to LaTeX, as the stem of the .dvi file will not correspond
+ * to the stem of the .tex file anymore.
+ * Use os::CREATE if the file is to be accessed for writing.
+ */
+ std::string toSafeFilesystemEncoding(os::file_access how = os::EXISTING) const;
+
/// returns true if the file exists
bool exists() const;
/// refreshes the file info
///
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;
+ 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;
+ 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
* with @c dir.
*/
std::string
- mangledFilename(std::string const & dir = empty_string()) const;
+ 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 unzippedFilename() const;
+ std::string unzippedFileName() const;
private:
/// Records whether we should save (or export) the filename as a relative