using System; using System.Collections.Generic; using UnityEngine; using ZXL; namespace ZXLA { public enum FileOperationType { Create, Delete } public enum FileObjectType { File, Directory } public class FileSystemOperation { public FileObjectType FileObjectType { get; } public FileOperationType FileOperationType { get; } public string OldPath { get; } public string NewPath { get; } public IReadOnlyList OldPaths { get; } public IReadOnlyList NewPaths { get; } public FileSystemOperation(FileObjectType fileObjectType, FileOperationType fileOperationType, string oldPath, string newPath, IReadOnlyList oldPaths, IReadOnlyList newPaths) { FileObjectType = fileObjectType; FileOperationType = fileOperationType; OldPath = oldPath; NewPath = newPath; OldPaths = oldPaths; NewPaths = newPaths; } } public class FileSystem : MonoBehaviour { private SortedDictionary dic = new SortedDictionary(); public event Action OnCeateFile; public event Action OnCeateDirectory; public event Action OnFileSystemChanged; public void CreateFile(string path, int parentDepth) { dic.Add(path, new File() { path = path, depth = parentDepth + 1 }); OnFileSystemChanged?.Invoke(new FileSystemOperation(FileObjectType.File, FileOperationType.Create, null, path, null, null)); } public void CreateDirectory(string path, int parentDepth) { dic.Add(path, new Directory() { path = path, depth = parentDepth + 1 }); OnFileSystemChanged?.Invoke(new FileSystemOperation(FileObjectType.Directory, FileOperationType.Create, null, path, null, null)); } public void DeleteDirectory(string path) { var keys = dic.Keys.ToListPooled(); var indexOf = keys.IndexOf(path); for (int i = indexOf + 1; i < keys.Count; i++) { if (dic[keys[i]] is not File) break; DeleteFileInternal(keys[i]); } keys.Free(); dic.Remove(path); OnFileSystemChanged?.Invoke(new FileSystemOperation(FileObjectType.Directory, FileOperationType.Delete, null, path, null, null)); } public void DeleteFile(string path) { DeleteFileInternal(path); OnFileSystemChanged?.Invoke(new FileSystemOperation(FileObjectType.File, FileOperationType.Delete, null, path, null, null)); } private void DeleteFileInternal(string path) { dic.Remove(path); } public IReadOnlyDictionary GetAllObjects() { return this.dic; } } public class FileSystemObject { public string path; public int depth; public bool isDisplay; public FileObjectType fileType; } class File : FileSystemObject { private void Awake() { fileType = FileObjectType.File; } } class Directory : FileSystemObject { private void Awake() { fileType = FileObjectType.Directory; } } }