| 
									
										
										
										
											2015-05-24 06:55:12 +02:00
										 |  |  | // Copyright 2008 Dolphin Emulator Project
 | 
					
						
							| 
									
										
										
										
											2015-05-18 01:08:10 +02:00
										 |  |  | // Licensed under GPLv2+
 | 
					
						
							| 
									
										
										
										
											2013-04-17 23:09:55 -04:00
										 |  |  | // Refer to the license.txt file included.
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-10 13:54:46 -05:00
										 |  |  | #pragma once
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-20 04:11:52 +01:00
										 |  |  | #include <cstddef>
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include <fstream>
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include <vector>
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 11:20:38 +02:00
										 |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-09-26 17:13:07 -04:00
										 |  |  | #include "Common/CommonTypes.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-20 04:11:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							| 
									
										
										
										
											2014-02-17 05:18:15 -05:00
										 |  |  | #include "Common/StringUtil.h"
 | 
					
						
							| 
									
										
										
										
											2014-02-20 04:11:52 +01:00
										 |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-02-02 21:56:29 +00:00
										 |  |  | // User directory indices for GetUserPath
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  | enum | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |   D_USER_IDX, | 
					
						
							|  |  |  |   D_GCUSER_IDX, | 
					
						
							|  |  |  |   D_WIIROOT_IDX,          // always points to User/Wii or global user-configured directory
 | 
					
						
							|  |  |  |   D_SESSION_WIIROOT_IDX,  // may point to minimal temporary directory for determinism
 | 
					
						
							|  |  |  |   D_CONFIG_IDX,           // global settings
 | 
					
						
							|  |  |  |   D_GAMESETTINGS_IDX,     // user-specified settings which override both the global and the default
 | 
					
						
							|  |  |  |                           // settings (per game)
 | 
					
						
							|  |  |  |   D_MAPS_IDX, | 
					
						
							|  |  |  |   D_CACHE_IDX, | 
					
						
							|  |  |  |   D_SHADERCACHE_IDX, | 
					
						
							|  |  |  |   D_SHADERS_IDX, | 
					
						
							|  |  |  |   D_STATESAVES_IDX, | 
					
						
							|  |  |  |   D_SCREENSHOTS_IDX, | 
					
						
							|  |  |  |   D_HIRESTEXTURES_IDX, | 
					
						
							|  |  |  |   D_DUMP_IDX, | 
					
						
							|  |  |  |   D_DUMPFRAMES_IDX, | 
					
						
							|  |  |  |   D_DUMPAUDIO_IDX, | 
					
						
							|  |  |  |   D_DUMPTEXTURES_IDX, | 
					
						
							|  |  |  |   D_DUMPDSP_IDX, | 
					
						
							| 
									
										
										
										
											2015-07-11 10:31:03 +02:00
										 |  |  |   D_DUMPSSL_IDX, | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   D_LOAD_IDX, | 
					
						
							|  |  |  |   D_LOGS_IDX, | 
					
						
							|  |  |  |   D_MAILLOGS_IDX, | 
					
						
							|  |  |  |   D_THEMES_IDX, | 
					
						
							|  |  |  |   D_PIPES_IDX, | 
					
						
							|  |  |  |   D_MEMORYWATCHER_IDX, | 
					
						
							| 
									
										
										
										
											2017-01-03 03:31:45 +01:00
										 |  |  |   D_WFSROOT_IDX, | 
					
						
							| 
									
										
										
										
											2016-12-23 20:37:23 -05:00
										 |  |  |   D_BACKUP_IDX, | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   F_DOLPHINCONFIG_IDX, | 
					
						
							| 
									
										
										
										
											2016-01-14 16:37:33 -06:00
										 |  |  |   F_GCPADCONFIG_IDX, | 
					
						
							|  |  |  |   F_WIIPADCONFIG_IDX, | 
					
						
							|  |  |  |   F_GCKEYBOARDCONFIG_IDX, | 
					
						
							|  |  |  |   F_GFXCONFIG_IDX, | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   F_DEBUGGERCONFIG_IDX, | 
					
						
							|  |  |  |   F_LOGGERCONFIG_IDX, | 
					
						
							| 
									
										
										
										
											2016-01-14 16:37:33 -06:00
										 |  |  |   F_UICONFIG_IDX, | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   F_MAINLOG_IDX, | 
					
						
							|  |  |  |   F_RAMDUMP_IDX, | 
					
						
							|  |  |  |   F_ARAMDUMP_IDX, | 
					
						
							|  |  |  |   F_FAKEVMEMDUMP_IDX, | 
					
						
							|  |  |  |   F_GCSRAM_IDX, | 
					
						
							|  |  |  |   F_MEMORYWATCHERLOCATIONS_IDX, | 
					
						
							|  |  |  |   F_MEMORYWATCHERSOCKET_IDX, | 
					
						
							| 
									
										
										
										
											2016-07-16 21:40:19 +02:00
										 |  |  |   F_WIISDCARD_IDX, | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   NUM_PATH_INDICES | 
					
						
							| 
									
										
										
										
											2010-02-02 21:56:29 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | namespace File | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | // FileSystem tree node/
 | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | struct FSTEntry | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   bool isDirectory; | 
					
						
							|  |  |  |   u64 size;                  // File length, or for directories, recursive count of children
 | 
					
						
							|  |  |  |   std::string physicalName;  // Name on disk
 | 
					
						
							|  |  |  |   std::string virtualName;   // Name in FST names table
 | 
					
						
							|  |  |  |   std::vector<FSTEntry> children; | 
					
						
							| 
									
										
										
										
											2008-12-08 04:46:09 +00:00
										 |  |  | }; | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 11:20:38 +02:00
										 |  |  | // The functions in this class are functionally identical to the standalone functions
 | 
					
						
							|  |  |  | // below, but if you are going to be calling more than one of the functions using the
 | 
					
						
							|  |  |  | // same path, creating a single FileInfo object and calling its functions multiple
 | 
					
						
							|  |  |  | // times is faster than calling standalone functions multiple times.
 | 
					
						
							|  |  |  | class FileInfo final | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |   explicit FileInfo(const std::string& path); | 
					
						
							|  |  |  |   explicit FileInfo(const char* path); | 
					
						
							|  |  |  |   explicit FileInfo(int fd); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Returns true if the path exists
 | 
					
						
							|  |  |  |   bool Exists() const; | 
					
						
							|  |  |  |   // Returns true if the path exists and is a directory
 | 
					
						
							|  |  |  |   bool IsDirectory() const; | 
					
						
							|  |  |  |   // Returns true if the path exists and is a file
 | 
					
						
							|  |  |  |   bool IsFile() const; | 
					
						
							|  |  |  |   // Returns the size of a file (or returns 0 if the path doesn't refer to a file)
 | 
					
						
							|  |  |  |   u64 GetSize() const; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | private: | 
					
						
							|  |  |  |   struct stat m_stat; | 
					
						
							|  |  |  |   bool m_exists; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Returns true if the path exists
 | 
					
						
							|  |  |  | bool Exists(const std::string& path); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Returns true if the path exists and is a directory
 | 
					
						
							|  |  |  | bool IsDirectory(const std::string& path); | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 11:20:38 +02:00
										 |  |  | // Returns true if the path exists and is a file
 | 
					
						
							|  |  |  | bool IsFile(const std::string& path); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 11:20:38 +02:00
										 |  |  | // Returns the size of a file (or returns 0 if the path isn't a file that exists)
 | 
					
						
							|  |  |  | u64 GetSize(const std::string& path); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-03 12:42:01 +00:00
										 |  |  | // Overloaded GetSize, accepts file descriptor
 | 
					
						
							|  |  |  | u64 GetSize(const int fd); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Overloaded GetSize, accepts FILE*
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:16:51 +01:00
										 |  |  | u64 GetSize(FILE* f); | 
					
						
							| 
									
										
										
										
											2010-12-03 12:42:01 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | // Returns true if successful, or path already exists.
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool CreateDir(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Creates the full path of fullPath returns true on success
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool CreateFullPath(const std::string& fullPath); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Deletes a given filename, return true on success
 | 
					
						
							|  |  |  | // Doesn't supports deleting a directory
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool Delete(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Deletes a directory filename, returns true on success
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool DeleteDir(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | // renames file srcFilename to destFilename, returns true on success
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool Rename(const std::string& srcFilename, const std::string& destFilename); | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 02:52:06 -04:00
										 |  |  | // ditto, but syncs the source file and, on Unix, syncs the directories after rename
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool RenameSync(const std::string& srcFilename, const std::string& destFilename); | 
					
						
							| 
									
										
										
										
											2013-10-15 02:52:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | // copies file srcFilename to destFilename, returns true on success
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool Copy(const std::string& srcFilename, const std::string& destFilename); | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-29 01:23:17 -04:00
										 |  |  | // creates an empty file filename, returns true on success
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool CreateEmptyFile(const std::string& filename); | 
					
						
							| 
									
										
										
										
											2009-06-09 19:40:47 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-25 21:57:33 +01:00
										 |  |  | // Recursive or non-recursive list of files and directories under directory.
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | FSTEntry ScanDirectoryTree(const std::string& directory, bool recursive); | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | // deletes the given directory and anything under it. Returns true on success.
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool DeleteDirRecursively(const std::string& directory); | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | // Returns the current directory
 | 
					
						
							|  |  |  | std::string GetCurrentDir(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-17 16:45:39 +02:00
										 |  |  | // Create directory and copy contents (optionally overwrites existing files)
 | 
					
						
							|  |  |  | void CopyDir(const std::string& source_path, const std::string& dest_path, | 
					
						
							|  |  |  |              bool destructive = false); | 
					
						
							| 
									
										
										
										
											2010-02-02 21:56:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-28 01:26:56 +00:00
										 |  |  | // Set the current directory to given directory
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | bool SetCurrentDir(const std::string& directory); | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-17 20:59:14 -05:00
										 |  |  | // Creates and returns the path to a new temporary directory.
 | 
					
						
							|  |  |  | std::string CreateTempDir(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-10-15 02:52:06 -04:00
										 |  |  | // Get a filename that can hopefully be atomically renamed to the given path.
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | std::string GetTempFilenameForAtomicWrite(const std::string& path); | 
					
						
							| 
									
										
										
										
											2013-10-15 02:52:06 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-03-15 08:51:13 -05:00
										 |  |  | // Gets a set user directory path
 | 
					
						
							|  |  |  | // Don't call prior to setting the base user directory
 | 
					
						
							|  |  |  | const std::string& GetUserPath(unsigned int dir_index); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Sets a user directory path
 | 
					
						
							|  |  |  | // Rebuilds internal directory structure to compensate for the new directory
 | 
					
						
							|  |  |  | void SetUserPath(unsigned int dir_index, const std::string& path); | 
					
						
							| 
									
										
										
										
											2013-04-01 23:17:15 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | // probably doesn't belong here
 | 
					
						
							| 
									
										
										
										
											2013-04-02 13:04:40 -05:00
										 |  |  | std::string GetThemeDir(const std::string& theme_name); | 
					
						
							| 
									
										
										
										
											2009-08-06 06:18:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-28 23:21:51 +00:00
										 |  |  | // Returns the path to where the sys file are
 | 
					
						
							|  |  |  | std::string GetSysDirectory(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 11:27:24 +02:00
										 |  |  | #ifdef ANDROID
 | 
					
						
							|  |  |  | void SetSysDirectory(const std::string& path); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-28 23:21:51 +00:00
										 |  |  | #ifdef __APPLE__
 | 
					
						
							|  |  |  | std::string GetBundleDirectory(); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-01-21 21:27:56 +01:00
										 |  |  | std::string& GetExeDirectory(); | 
					
						
							| 
									
										
										
										
											2011-06-11 20:45:09 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-12 15:33:41 -04:00
										 |  |  | bool WriteStringToFile(const std::string& str, const std::string& filename); | 
					
						
							|  |  |  | bool ReadFileToString(const std::string& filename, std::string& str); | 
					
						
							| 
									
										
										
										
											2009-04-12 10:21:40 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-28 19:33:39 -06:00
										 |  |  | // To deal with Windows being dumb at unicode:
 | 
					
						
							|  |  |  | template <typename T> | 
					
						
							|  |  |  | void OpenFStream(T& fstream, const std::string& filename, std::ios_base::openmode openmode) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #ifdef _WIN32
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   fstream.open(UTF8ToTStr(filename).c_str(), openmode); | 
					
						
							| 
									
										
										
										
											2013-02-28 19:33:39 -06:00
										 |  |  | #else
 | 
					
						
							| 
									
										
										
										
											2016-06-24 10:43:46 +02:00
										 |  |  |   fstream.open(filename.c_str(), openmode); | 
					
						
							| 
									
										
										
										
											2013-02-28 19:33:39 -06:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2017-01-15 22:46:43 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | }  // namespace
 |