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<IEntry> Entries = new List<IEntry>();
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<IEntry>)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<File>().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<IEntry>();
}
public string Name { get; set; }
public string Comment { get; set; }
public List<IEntry> 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<File>().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
{
}
}