Virtual File System


SUBMITTED BY: Guest

DATE: Jan. 19, 2014, 11:23 a.m.

FORMAT: C#

SIZE: 7.7 kB

HITS: 786

  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Runtime.Serialization.Formatters.Binary;
  6. namespace Lib.Data.VFS
  7. {
  8. public class FileSystem
  9. {
  10. private readonly List<IEntry> Entries = new List<IEntry>();
  11. private readonly string file;
  12. public FileSystem(string vfsfile)
  13. {
  14. file = vfsfile;
  15. if (!System.IO.File.Exists(vfsfile))
  16. System.IO.File.WriteAllText(file, StringCompressor.CompressString(SerializeObject(Entries)));
  17. else
  18. {
  19. var c = StringCompressor.DecompressString(System.IO.File.ReadAllText(vfsfile));
  20. Entries = (List<IEntry>)DeserializeObject(c);
  21. }
  22. }
  23. private static string SerializeObject(object o)
  24. {
  25. if (!o.GetType().IsSerializable)
  26. {
  27. return null;
  28. }
  29. using (var stream = new MemoryStream())
  30. {
  31. new BinaryFormatter().Serialize(stream, o);
  32. return Convert.ToBase64String(stream.ToArray());
  33. }
  34. }
  35. private static object DeserializeObject(string str)
  36. {
  37. if (str != "")
  38. {
  39. var bytes = Convert.FromBase64String(str);
  40. using (var stream = new MemoryStream(bytes))
  41. {
  42. return new BinaryFormatter().Deserialize(stream);
  43. }
  44. }
  45. return null;
  46. }
  47. public void Save()
  48. {
  49. System.IO.File.WriteAllText(file, StringCompressor.CompressString(SerializeObject(Entries)));
  50. }
  51. public void AddFile(string name, string content, string comment = "")
  52. {
  53. Entries.Add(new File {Header = new Header {Filename = name, Size = content.Length, Comment = comment}, Content=content});
  54. }
  55. public void AddFile(string path)
  56. {
  57. AddFile(Path.GetFileName(path), System.IO.File.ReadAllText(path));
  58. }
  59. public void AddFolder(string name)
  60. {
  61. Entries.Add(new Folder {Name = name});
  62. }
  63. public void AddFolder(Folder f)
  64. {
  65. for (var index = 0; index < Entries.Count; index++)
  66. {
  67. if (Entries[index] is Folder)
  68. {
  69. var entry = Entries[index] as Folder;
  70. if (entry.Name == f.Name)
  71. {
  72. Entries.Remove(f);
  73. break;
  74. }
  75. }
  76. }
  77. Entries.Add(f);
  78. }
  79. public File GetFile(string name)
  80. {
  81. return Entries.Where(entry => (entry as File).Header.Filename == name).Cast<File>().FirstOrDefault();
  82. }
  83. public File[] GetFiles()
  84. {
  85. return (File[]) Entries.ToArray();
  86. }
  87. public Folder GetFolder(string name)
  88. {
  89. foreach (var f in Entries)
  90. {
  91. if (f is Folder)
  92. {
  93. var ff = f as Folder;
  94. if (ff.Name == name)
  95. {
  96. return ff;
  97. }
  98. }
  99. }
  100. return new Folder();
  101. }
  102. public void DeleteFile(string name)
  103. {
  104. foreach (var entry in Entries.Where(entry => (entry as File).Header.Filename == name))
  105. {
  106. Entries.Remove(entry);
  107. break;
  108. }
  109. }
  110. public void DeleteFolder(string name)
  111. {
  112. foreach (var entry in Entries.Where(entry => (entry as Folder).Name == name))
  113. {
  114. Entries.Remove(entry);
  115. break;
  116. }
  117. }
  118. }
  119. }
  120. using System;
  121. namespace Lib.Data.VFS
  122. {
  123. [Serializable]
  124. public class File : IEntry
  125. {
  126. public File()
  127. {
  128. Header = new Header();
  129. }
  130. public Header Header { get; set; }
  131. public string Content { get; set; }
  132. }
  133. }
  134. using System;
  135. using System.Collections.Generic;
  136. using System.IO;
  137. using System.Linq;
  138. namespace Lib.Data.VFS
  139. {
  140. [Serializable]
  141. public class Folder : IEntry
  142. {
  143. public Folder()
  144. {
  145. Entries = new List<IEntry>();
  146. }
  147. public string Name { get; set; }
  148. public string Comment { get; set; }
  149. public List<IEntry> Entries { get; set; }
  150. public int Size { get; set; }
  151. public void AddFile(string name, string content, string comment = "")
  152. {
  153. Entries.Add(new File { Header = new Header { Filename = name, Size = content.Length, Comment = comment }, Content = content });
  154. }
  155. public void AddFile(string path)
  156. {
  157. AddFile(Path.GetFileName(path), System.IO.File.ReadAllText(path));
  158. }
  159. public void AddFolder(Folder f)
  160. {
  161. for (var index = 0; index < Entries.Count; index++)
  162. {
  163. if (Entries[index] is Folder)
  164. {
  165. var entry = Entries[index] as Folder;
  166. if (entry.Name == f.Name)
  167. {
  168. Entries.Remove(f);
  169. break;
  170. }
  171. }
  172. }
  173. Entries.Add(f);
  174. }
  175. public void AddFolder(string name)
  176. {
  177. Entries.Add(new Folder { Name = name });
  178. }
  179. public Folder GetFolder(string name)
  180. {
  181. foreach (var f in Entries)
  182. {
  183. if (f is Folder)
  184. {
  185. var ff = f as Folder;
  186. if (ff.Name == name)
  187. {
  188. return ff;
  189. }
  190. }
  191. }
  192. return new Folder();
  193. }
  194. public File GetFile(string name)
  195. {
  196. return Entries.Where(entry => (entry as File).Header.Filename == name).Cast<File>().FirstOrDefault();
  197. }
  198. public void DeleteFile(string name)
  199. {
  200. foreach (var entry in Entries.Where(entry => (entry as File).Header.Filename == name))
  201. {
  202. Entries.Remove(entry);
  203. break;
  204. }
  205. }
  206. public void DeleteFolder(string name)
  207. {
  208. foreach (var entry in Entries.Where(entry => (entry as Folder).Name == name))
  209. {
  210. Entries.Remove(entry);
  211. break;
  212. }
  213. }
  214. }
  215. }
  216. using System;
  217. namespace Lib.Data.VFS
  218. {
  219. [Serializable]
  220. public class Header
  221. {
  222. public string Filename { get; set; }
  223. public int Size { get; set; }
  224. public string Comment { get; set; }
  225. }
  226. }
  227. namespace Lib.Data.VFS
  228. {
  229. public interface IEntry
  230. {
  231. }
  232. }

comments powered by Disqus