254 lines
7.1 KiB
C#
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();
|
|
}
|
|
}
|
|
} |