using System; using System.Collections.Generic; using System.IO; using ZXL.Helper; namespace ZXLT.FileSystem { class FileBase { protected FileSystemInfo _systemInfo; public FileSystemInfo SystemInfo => _systemInfo; } class Directory : FileBase { List directories = new List(); List files = new List(); public Directory(DirectoryInfo directoryInfo) { this._systemInfo = directoryInfo; } public IReadOnlyList GetDirectories() { return directories; } public IReadOnlyList GetFiles() { return files; } public void AddDirectory(Directory dir) { directories.Add(dir); } public void AddFile(File file) { files.Add(file); } public void RemoveDirectory(Directory dir) { directories.Remove(dir); } public void RemoveFile(File file) { files.Remove(file); } public void Clear() { directories.Clear(); } } class File : FileBase { public File(FileInfo fileInfo) { this._systemInfo = fileInfo; } } interface IFileSystem { event Action OnUpdateFileSystem; void CreateDirectory(string path); void DeleteDirectory(string path); void DeleteFile(string path); void MoveDirectory(string sourcePath, string destPath); void MoveFile(string sourcePath, string destPath); void RenameDirectory(string sourcePath, string destPath); void RenameFile(string sourcePath, string destPath); } public class FileSystem : IFileSystem { Directory rootDirectory; SortedDictionary fileBases = new SortedDictionary(); public event Action OnUpdateFileSystem; #region RootDir // directory void RenameDirectory_I(string oldPath, Directory tihuan) { RemoveDirectory_I(rootDirectory, oldPath); AddDirectory_I(rootDirectory, oldPath, tihuan); } void RemoveDirectory_I(Directory dir, string sourcePath) { var directories = dir.GetDirectories(); foreach (var directory in directories) { if (directory.SystemInfo.FullName == sourcePath) { fileBases.Remove(directory.SystemInfo.FullName); dir.RemoveDirectory(directory); return; } this.RemoveDirectory_I(directory, sourcePath); } } void AddDirectory_I(Directory dir, string parentPath, Directory tihuan) { var directories = dir.GetDirectories(); foreach (var directory in directories) { if (directory.SystemInfo.FullName == parentPath) { fileBases.Add(tihuan.SystemInfo.FullName, tihuan); dir.AddDirectory(tihuan); return; } this.AddDirectory_I(directory, parentPath, tihuan); } } void MoveDirectory_I(string sourcePath, string destPath, Directory tihuan) { RemoveDirectory_I(rootDirectory, sourcePath); AddDirectory_I(rootDirectory, destPath, tihuan); } // file void RenameFile_I(Directory dir, string path, File tihuan) { var list = dir.GetFiles(); foreach (var file in list) { if (file.SystemInfo.FullName == path) { fileBases.Remove(file.SystemInfo.FullName); fileBases.Add(tihuan.SystemInfo.FullName, tihuan); rootDirectory.RemoveFile(file); rootDirectory.AddFile(tihuan); return; } } var directories = rootDirectory.GetDirectories(); foreach (var directory in directories) { this.RenameFile_I(directory, path, tihuan); } } void RemoveFile_I(Directory dir, string sourcePath) { var files = dir.GetFiles(); foreach (var file in files) { if (file.SystemInfo.FullName == sourcePath) { fileBases.Remove(file.SystemInfo.FullName); dir.RemoveFile(file); return; } } var directories = dir.GetDirectories(); foreach (var directory in directories) { this.RemoveFile_I(directory, sourcePath); } } void AddFile_I(Directory dir, string path, File tihuan) { var files = dir.GetFiles(); foreach (var file in files) { if (file.SystemInfo.FullName == path) { fileBases.Add(tihuan.SystemInfo.FullName, tihuan); dir.AddFile(tihuan); return; } } var directories = dir.GetDirectories(); foreach (var directory in directories) { this.AddFile_I(directory, path, tihuan); } } void MoveFile_I(string sourcePath, string destPath, File file) { RemoveFile_I(rootDirectory, sourcePath); AddFile_I(rootDirectory, destPath, file); } #endregion void UpdateFileSystem(FileSystemInfo systemInfo) { OnUpdateFileSystem?.Invoke(systemInfo); } public void CreateDirectory(string path) { var directory = new Directory(new DirectoryInfo(path)); AddDirectory_I(rootDirectory, path, directory); fileBases.Add(path, directory); FileHelper.CreateDirectory(path); } public void CreateFile(string path) { var file = new File(new FileInfo(path)); fileBases.Add(path, file); FileHelper.CreateDirectory(path); } public void DeleteDirectory(string path) { throw new NotImplementedException(); } public void DeleteFile(string path) { throw new NotImplementedException(); } public void MoveDirectory(string sourcePath, string destPath) { throw new NotImplementedException(); } public void MoveFile(string sourcePath, string destPath) { throw new NotImplementedException(); } public void RenameDirectory(string sourcePath, string destPath) { throw new NotImplementedException(); } public void RenameFile(string sourcePath, string destPath) { throw new NotImplementedException(); } } }