EditorTool3D/Assets/ZXL/Scripts/FileSystem/FileSystem.cs

254 lines
7.1 KiB
C#

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<Directory> directories = new List<Directory>();
List<File> files = new List<File>();
public Directory(DirectoryInfo directoryInfo)
{
this._systemInfo = directoryInfo;
}
public IReadOnlyList<Directory> GetDirectories()
{
return directories;
}
public IReadOnlyList<File> 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<FileSystemInfo> 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<string, FileBase> fileBases = new SortedDictionary<string, FileBase>();
public event Action<FileSystemInfo> 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();
}
}
}