167 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			C#
		
	
	
	
| using System.IO;
 | |
| using System;
 | |
| using UnityEngine;
 | |
| 
 | |
| namespace ES3Internal
 | |
| {
 | |
|     public static class ES3IO
 | |
|     {
 | |
| #if UNITY_SWITCH
 | |
|         internal static readonly string persistentDataPath = "";
 | |
| #else
 | |
|         internal static readonly string persistentDataPath = Application.persistentDataPath;
 | |
| #endif
 | |
| 
 | |
|         internal const string backupFileSuffix = ".bac";
 | |
|         internal const string temporaryFileSuffix = ".tmp";
 | |
| 
 | |
|         public enum ES3FileMode { Read, Write, Append }
 | |
| 
 | |
|         public static DateTime GetTimestamp(string filePath)
 | |
|         {
 | |
|             if (!FileExists(filePath))
 | |
|                 return new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc);
 | |
|             return File.GetLastWriteTime(filePath).ToUniversalTime();
 | |
|         }
 | |
| 
 | |
|         public static string GetExtension(string path)
 | |
|         {
 | |
|             return Path.GetExtension(path);
 | |
|         }
 | |
| 
 | |
|         public static void DeleteFile(string filePath)
 | |
|         {
 | |
|             if (FileExists(filePath))
 | |
|                 File.Delete(filePath);
 | |
|         }
 | |
| 
 | |
|         public static bool FileExists(string filePath) { return File.Exists(filePath); }
 | |
|         public static void MoveFile(string sourcePath, string destPath) { File.Move(sourcePath, destPath); }
 | |
|         public static void CopyFile(string sourcePath, string destPath) { File.Copy(sourcePath, destPath); }
 | |
| 
 | |
|         public static void MoveDirectory(string sourcePath, string destPath) { Directory.Move(sourcePath, destPath); }
 | |
|         public static void CreateDirectory(string directoryPath) { Directory.CreateDirectory(directoryPath); }
 | |
|         public static bool DirectoryExists(string directoryPath) { return Directory.Exists(directoryPath); }
 | |
| 
 | |
|         /*
 | |
| 		 * 	Given a path, it returns the directory that path points to.
 | |
| 		 * 	eg. "C:/myFolder/thisFolder/myFile.txt" will return "C:/myFolder/thisFolder".
 | |
| 		 */
 | |
|         public static string GetDirectoryPath(string path, char seperator = '/')
 | |
|         {
 | |
|             //return Path.GetDirectoryName(path);
 | |
|             // Path.GetDirectoryName turns forward slashes to backslashes in some cases on Windows, which is why
 | |
|             // Substring is used instead.
 | |
|             char slashChar = UsesForwardSlash(path) ? '/' : '\\';
 | |
| 
 | |
|             int slash = path.LastIndexOf(slashChar);
 | |
|             // Ignore trailing slash if necessary.
 | |
|             if (slash == (path.Length - 1))
 | |
|                 slash = path.Substring(0, slash).LastIndexOf(slashChar);
 | |
|             if (slash == -1)
 | |
|                 ES3Debug.LogError("Path provided is not a directory path as it contains no slashes.");
 | |
|             return path.Substring(0, slash);
 | |
|         }
 | |
| 
 | |
|         public static bool UsesForwardSlash(string path)
 | |
|         {
 | |
|             if (path.Contains("/"))
 | |
|                 return true;
 | |
|             return false;
 | |
|         }
 | |
| 
 | |
|         // Takes a directory path and a file or directory name and combines them into a single path.
 | |
|         public static string CombinePathAndFilename(string directoryPath, string fileOrDirectoryName)
 | |
|         {
 | |
|             if (directoryPath[directoryPath.Length - 1] != '/' && directoryPath[directoryPath.Length - 1] != '\\')
 | |
|                 directoryPath += '/';
 | |
|             return directoryPath + fileOrDirectoryName;
 | |
|         }
 | |
| 
 | |
|         public static string[] GetDirectories(string path, bool getFullPaths = true)
 | |
|         {
 | |
|             var paths = Directory.GetDirectories(path);
 | |
|             for (int i = 0; i < paths.Length; i++)
 | |
|             {
 | |
|                 if (!getFullPaths)
 | |
|                     paths[i] = Path.GetFileName(paths[i]);
 | |
|                 // GetDirectories sometimes returns backslashes, so we need to convert them to
 | |
|                 // forward slashes.
 | |
|                 paths[i].Replace("\\", "/");
 | |
|             }
 | |
|             return paths;
 | |
|         }
 | |
| 
 | |
|         public static void DeleteDirectory(string directoryPath)
 | |
|         {
 | |
|             if (DirectoryExists(directoryPath))
 | |
|                 Directory.Delete(directoryPath, true);
 | |
|         }
 | |
| 
 | |
|         public static string[] GetFiles(string path, bool getFullPaths = true)
 | |
|         {
 | |
|             var paths = Directory.GetFiles(path);
 | |
|             if (!getFullPaths)
 | |
|             {
 | |
|                 for (int i = 0; i < paths.Length; i++)
 | |
|                     paths[i] = Path.GetFileName(paths[i]);
 | |
|             }
 | |
|             return paths;
 | |
|         }
 | |
| 
 | |
|         public static byte[] ReadAllBytes(string path)
 | |
|         {
 | |
|             return File.ReadAllBytes(path);
 | |
|         }
 | |
| 
 | |
|         public static void WriteAllBytes(string path, byte[] bytes)
 | |
|         {
 | |
|             File.WriteAllBytes(path, bytes);
 | |
|         }
 | |
| 
 | |
|         public static void CommitBackup(ES3Settings settings)
 | |
|         {
 | |
|             ES3Debug.Log("Committing backup for " + settings.path + " to storage location " + settings.location);
 | |
| 
 | |
|             var temporaryFilePath = settings.FullPath + temporaryFileSuffix;
 | |
| 
 | |
|             if (settings.location == ES3.Location.File)
 | |
|             {
 | |
|                 var oldFileBackup = settings.FullPath + temporaryFileSuffix + ".bak";
 | |
| 
 | |
|                 // If there's existing save data to overwrite ...
 | |
|                 if (FileExists(settings.FullPath))
 | |
|                 {
 | |
|                     // Delete any old backups.
 | |
|                     DeleteFile(oldFileBackup);
 | |
|                     // Rename the old file so we can restore it if it fails.
 | |
|                     MoveFile(settings.FullPath, oldFileBackup);
 | |
| 
 | |
|                     try
 | |
|                     {
 | |
|                         // Now rename the temporary file to the name of the save file.
 | |
|                         MoveFile(temporaryFilePath, settings.FullPath);
 | |
|                     }
 | |
|                     catch (Exception e)
 | |
|                     {
 | |
|                         // If any exceptions occur, restore the original save file.
 | |
|                         try { DeleteFile(settings.FullPath); } catch { }
 | |
|                         MoveFile(oldFileBackup, settings.FullPath);
 | |
|                         throw e;
 | |
|                     }
 | |
| 
 | |
|                     DeleteFile(oldFileBackup);
 | |
|                 }
 | |
|                 // Else just rename the temporary file to the main file.
 | |
|                 else
 | |
|                     MoveFile(temporaryFilePath, settings.FullPath);
 | |
|             }
 | |
|             else if (settings.location == ES3.Location.PlayerPrefs)
 | |
|             {
 | |
|                 PlayerPrefs.SetString(settings.FullPath, PlayerPrefs.GetString(temporaryFilePath));
 | |
|                 PlayerPrefs.DeleteKey(temporaryFilePath);
 | |
|                 PlayerPrefs.Save();
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| } |