using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.Serialization.Formatters.Binary; namespace Lib.Data.VFS { public class FileSystem { private readonly List Entries = new List(); private readonly string file; public FileSystem(string vfsfile) { file = vfsfile; if (!System.IO.File.Exists(vfsfile)) System.IO.File.WriteAllText(file, StringCompressor.CompressString(SerializeObject(Entries))); else { var c = StringCompressor.DecompressString(System.IO.File.ReadAllText(vfsfile)); Entries = (List)DeserializeObject(c); } } private static string SerializeObject(object o) { if (!o.GetType().IsSerializable) { return null; } using (var stream = new MemoryStream()) { new BinaryFormatter().Serialize(stream, o); return Convert.ToBase64String(stream.ToArray()); } } private static object DeserializeObject(string str) { if (str != "") { var bytes = Convert.FromBase64String(str); using (var stream = new MemoryStream(bytes)) { return new BinaryFormatter().Deserialize(stream); } } return null; } public void Save() { System.IO.File.WriteAllText(file, StringCompressor.CompressString(SerializeObject(Entries))); } public void AddFile(string name, string content, string comment = "") { Entries.Add(new File {Header = new Header {Filename = name, Size = content.Length, Comment = comment}, Content=content}); } public void AddFile(string path) { AddFile(Path.GetFileName(path), System.IO.File.ReadAllText(path)); } public void AddFolder(string name) { Entries.Add(new Folder {Name = name}); } public void AddFolder(Folder f) { for (var index = 0; index < Entries.Count; index++) { if (Entries[index] is Folder) { var entry = Entries[index] as Folder; if (entry.Name == f.Name) { Entries.Remove(f); break; } } } Entries.Add(f); } public File GetFile(string name) { return Entries.Where(entry => (entry as File).Header.Filename == name).Cast().FirstOrDefault(); } public File[] GetFiles() { return (File[]) Entries.ToArray(); } public Folder GetFolder(string name) { foreach (var f in Entries) { if (f is Folder) { var ff = f as Folder; if (ff.Name == name) { return ff; } } } return new Folder(); } public void DeleteFile(string name) { foreach (var entry in Entries.Where(entry => (entry as File).Header.Filename == name)) { Entries.Remove(entry); break; } } public void DeleteFolder(string name) { foreach (var entry in Entries.Where(entry => (entry as Folder).Name == name)) { Entries.Remove(entry); break; } } } } using System; namespace Lib.Data.VFS { [Serializable] public class File : IEntry { public File() { Header = new Header(); } public Header Header { get; set; } public string Content { get; set; } } } using System; using System.Collections.Generic; using System.IO; using System.Linq; namespace Lib.Data.VFS { [Serializable] public class Folder : IEntry { public Folder() { Entries = new List(); } public string Name { get; set; } public string Comment { get; set; } public List Entries { get; set; } public int Size { get; set; } public void AddFile(string name, string content, string comment = "") { Entries.Add(new File { Header = new Header { Filename = name, Size = content.Length, Comment = comment }, Content = content }); } public void AddFile(string path) { AddFile(Path.GetFileName(path), System.IO.File.ReadAllText(path)); } public void AddFolder(Folder f) { for (var index = 0; index < Entries.Count; index++) { if (Entries[index] is Folder) { var entry = Entries[index] as Folder; if (entry.Name == f.Name) { Entries.Remove(f); break; } } } Entries.Add(f); } public void AddFolder(string name) { Entries.Add(new Folder { Name = name }); } public Folder GetFolder(string name) { foreach (var f in Entries) { if (f is Folder) { var ff = f as Folder; if (ff.Name == name) { return ff; } } } return new Folder(); } public File GetFile(string name) { return Entries.Where(entry => (entry as File).Header.Filename == name).Cast().FirstOrDefault(); } public void DeleteFile(string name) { foreach (var entry in Entries.Where(entry => (entry as File).Header.Filename == name)) { Entries.Remove(entry); break; } } public void DeleteFolder(string name) { foreach (var entry in Entries.Where(entry => (entry as Folder).Name == name)) { Entries.Remove(entry); break; } } } } using System; namespace Lib.Data.VFS { [Serializable] public class Header { public string Filename { get; set; } public int Size { get; set; } public string Comment { get; set; } } } namespace Lib.Data.VFS { public interface IEntry { } }