summaryrefslogtreecommitdiffstats
path: root/src/common/file_util.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/file_util.h118
1 files changed, 63 insertions, 55 deletions
diff --git a/src/common/file_util.h b/src/common/file_util.h
index 7ad7ee829..b15021a63 100644
--- a/src/common/file_util.h
+++ b/src/common/file_util.h
@@ -5,9 +5,9 @@
#pragma once
#include <array>
+#include <cstdio>
#include <fstream>
#include <functional>
-#include <cstdio>
#include <string>
#include <type_traits>
#include <vector>
@@ -51,75 +51,75 @@ enum {
NUM_PATH_INDICES
};
-namespace FileUtil
-{
+namespace FileUtil {
// FileSystem tree node/
-struct FSTEntry
-{
+struct FSTEntry {
bool isDirectory;
- u64 size; // file length or number of entries from children
- std::string physicalName; // name on disk
- std::string virtualName; // name in FST names table
+ u64 size; // file length or number of entries from children
+ std::string physicalName; // name on disk
+ std::string virtualName; // name in FST names table
std::vector<FSTEntry> children;
};
// Returns true if file filename exists
-bool Exists(const std::string &filename);
+bool Exists(const std::string& filename);
// Returns true if filename is a directory
-bool IsDirectory(const std::string &filename);
+bool IsDirectory(const std::string& filename);
// Returns the size of filename (64bit)
-u64 GetSize(const std::string &filename);
+u64 GetSize(const std::string& filename);
// Overloaded GetSize, accepts file descriptor
u64 GetSize(const int fd);
// Overloaded GetSize, accepts FILE*
-u64 GetSize(FILE *f);
+u64 GetSize(FILE* f);
// Returns true if successful, or path already exists.
-bool CreateDir(const std::string &filename);
+bool CreateDir(const std::string& filename);
// Creates the full path of fullPath returns true on success
-bool CreateFullPath(const std::string &fullPath);
+bool CreateFullPath(const std::string& fullPath);
// Deletes a given filename, return true on success
// Doesn't supports deleting a directory
-bool Delete(const std::string &filename);
+bool Delete(const std::string& filename);
// Deletes a directory filename, returns true on success
-bool DeleteDir(const std::string &filename);
+bool DeleteDir(const std::string& filename);
// renames file srcFilename to destFilename, returns true on success
-bool Rename(const std::string &srcFilename, const std::string &destFilename);
+bool Rename(const std::string& srcFilename, const std::string& destFilename);
// copies file srcFilename to destFilename, returns true on success
-bool Copy(const std::string &srcFilename, const std::string &destFilename);
+bool Copy(const std::string& srcFilename, const std::string& destFilename);
// creates an empty file filename, returns true on success
-bool CreateEmptyFile(const std::string &filename);
+bool CreateEmptyFile(const std::string& filename);
/**
- * @param num_entries_out to be assigned by the callable with the number of iterated directory entries, never null
+ * @param num_entries_out to be assigned by the callable with the number of iterated directory
+ * entries, never null
* @param directory the path to the enclosing directory
* @param virtual_name the entry name, without any preceding directory info
* @return whether handling the entry succeeded
*/
-using DirectoryEntryCallable = std::function<bool(unsigned* num_entries_out,
- const std::string& directory,
- const std::string& virtual_name)>;
+using DirectoryEntryCallable = std::function<bool(
+ unsigned* num_entries_out, const std::string& directory, const std::string& virtual_name)>;
/**
* Scans a directory, calling the callback for each file/directory contained within.
* If the callback returns failure, scanning halts and this function returns failure as well
- * @param num_entries_out assigned by the function with the number of iterated directory entries, can be null
+ * @param num_entries_out assigned by the function with the number of iterated directory entries,
+ * can be null
* @param directory the directory to scan
* @param callback The callback which will be called for each entry
* @return whether scanning the directory succeeded
*/
-bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directory, DirectoryEntryCallable callback);
+bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string& directory,
+ DirectoryEntryCallable callback);
/**
* Scans the directory tree, storing the results.
@@ -128,23 +128,24 @@ bool ForeachDirectoryEntry(unsigned* num_entries_out, const std::string &directo
* @param recursion Number of children directories to read before giving up.
* @return the total number of files/directories found
*/
-unsigned ScanDirectoryTree(const std::string &directory, FSTEntry& parent_entry, unsigned int recursion = 0);
+unsigned ScanDirectoryTree(const std::string& directory, FSTEntry& parent_entry,
+ unsigned int recursion = 0);
// deletes the given directory and anything under it. Returns true on success.
-bool DeleteDirRecursively(const std::string &directory, unsigned int recursion = 256);
+bool DeleteDirRecursively(const std::string& directory, unsigned int recursion = 256);
// Returns the current directory
std::string GetCurrentDir();
// Create directory and copy contents (does not overwrite existing files)
-void CopyDir(const std::string &source_path, const std::string &dest_path);
+void CopyDir(const std::string& source_path, const std::string& dest_path);
// Set the current directory to given directory
-bool SetCurrentDir(const std::string &directory);
+bool SetCurrentDir(const std::string& directory);
// Returns a pointer to a string with a Citra data dir in the user's home
// directory. To be used in "multi-user" mode (that is, installed).
-const std::string& GetUserPath(const unsigned int DirIDX, const std::string &newPath="");
+const std::string& GetUserPath(const unsigned int DirIDX, const std::string& newPath = "");
// Returns the path to where the sys file are
std::string GetSysDirectory();
@@ -154,11 +155,11 @@ std::string GetBundleDirectory();
#endif
#ifdef _WIN32
-std::string &GetExeDirectory();
+std::string& GetExeDirectory();
#endif
-size_t WriteStringToFile(bool text_file, const std::string &str, const char *filename);
-size_t ReadFileToString(bool text_file, const char *filename, std::string &str);
+size_t WriteStringToFile(bool text_file, const std::string& str, const char* filename);
+size_t ReadFileToString(bool text_file, const char* filename, std::string& str);
/**
* Splits the filename into 8.3 format
@@ -173,8 +174,7 @@ void SplitFilename83(const std::string& filename, std::array<char, 9>& short_nam
// simple wrapper for cstdlib file functions to
// hopefully will make error checking easier
// and make forgetting an fclose() harder
-class IOFile : public NonCopyable
-{
+class IOFile : public NonCopyable {
public:
IOFile();
IOFile(const std::string& filename, const char openmode[]);
@@ -190,11 +190,12 @@ public:
bool Close();
template <typename T>
- size_t ReadArray(T* data, size_t length)
- {
- static_assert(std::is_standard_layout<T>(), "Given array does not consist of standard layout objects");
+ size_t ReadArray(T* data, size_t length) {
+ static_assert(std::is_standard_layout<T>(),
+ "Given array does not consist of standard layout objects");
#if (__GNUC__ >= 5) || defined(__clang__) || defined(_MSC_VER)
- static_assert(std::is_trivially_copyable<T>(), "Given array does not consist of trivially copyable objects");
+ static_assert(std::is_trivially_copyable<T>(),
+ "Given array does not consist of trivially copyable objects");
#endif
if (!IsOpen()) {
@@ -210,11 +211,12 @@ public:
}
template <typename T>
- size_t WriteArray(const T* data, size_t length)
- {
- static_assert(std::is_standard_layout<T>(), "Given array does not consist of standard layout objects");
+ size_t WriteArray(const T* data, size_t length) {
+ static_assert(std::is_standard_layout<T>(),
+ "Given array does not consist of standard layout objects");
#if (__GNUC__ >= 5) || defined(__clang__) || defined(_MSC_VER)
- static_assert(std::is_trivially_copyable<T>(), "Given array does not consist of trivially copyable objects");
+ static_assert(std::is_trivially_copyable<T>(),
+ "Given array does not consist of trivially copyable objects");
#endif
if (!IsOpen()) {
@@ -229,27 +231,31 @@ public:
return items_written;
}
- size_t ReadBytes(void* data, size_t length)
- {
+ size_t ReadBytes(void* data, size_t length) {
return ReadArray(reinterpret_cast<char*>(data), length);
}
- size_t WriteBytes(const void* data, size_t length)
- {
+ size_t WriteBytes(const void* data, size_t length) {
return WriteArray(reinterpret_cast<const char*>(data), length);
}
- template<typename T>
+ template <typename T>
size_t WriteObject(const T& object) {
static_assert(!std::is_pointer<T>::value, "Given object is a pointer");
return WriteArray(&object, 1);
}
- bool IsOpen() const { return nullptr != m_file; }
+ bool IsOpen() const {
+ return nullptr != m_file;
+ }
// m_good is set to false when a read, write or other function fails
- bool IsGood() const { return m_good; }
- explicit operator bool() const { return IsGood(); }
+ bool IsGood() const {
+ return m_good;
+ }
+ explicit operator bool() const {
+ return IsGood();
+ }
bool Seek(s64 off, int origin);
u64 Tell() const;
@@ -258,19 +264,21 @@ public:
bool Flush();
// clear error state
- void Clear() { m_good = true; std::clearerr(m_file); }
+ void Clear() {
+ m_good = true;
+ std::clearerr(m_file);
+ }
private:
std::FILE* m_file = nullptr;
bool m_good = true;
};
-} // namespace
+} // namespace
// To deal with Windows being dumb at unicode:
template <typename T>
-void OpenFStream(T& fstream, const std::string& filename, std::ios_base::openmode openmode)
-{
+void OpenFStream(T& fstream, const std::string& filename, std::ios_base::openmode openmode) {
#ifdef _MSC_VER
fstream.open(Common::UTF8ToTStr(filename).c_str(), openmode);
#else