using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespace Tango.Core.IO { /// /// Represents the Tango system temporary file manager. /// public class TemporaryManager : IDisposable { #region Singleton private static TemporaryManager _default; /// /// Gets the default temporary manager instance. /// public static TemporaryManager Default { get { if (_default == null) { _default = new TemporaryManager(); } return _default; } } /// /// Prevents a default instance of the class from being created. /// private TemporaryManager() { Items = new List().ToReadOnlyCollection(); RootPath = Path.Combine(Path.GetTempPath(), "Twine"); Directory.CreateDirectory(RootPath); } #endregion private bool _disposed; /// /// Gets or sets the temporary root path. /// public String RootPath { get; protected set; } /// /// Gets the collection of temporary items. /// public IReadOnlyCollection Items { get; protected set; } /// /// Adds the item. /// /// The item. private void AddItem(ITemporaryItem item) { var list = Items.ToList(); list.Add(item); Items = list.ToReadOnlyCollection(); item.Deleted += Item_Deleted; } /// /// Removes the item. /// /// The item. private void RemoveItem(ITemporaryItem item) { var list = Items.ToList(); list.Remove(item); Items = list.ToReadOnlyCollection(); item.Deleted -= Item_Deleted; } /// /// Handles the Deleted event of the item. /// /// The source of the event. /// The instance containing the event data. private void Item_Deleted(object sender, EventArgs e) { RemoveItem(sender as ITemporaryItem); } /// /// Creates a new temporary folder and returns the folder item. /// /// public virtual TemporaryFolder CreateFolder() { TemporaryFolder folder = new TemporaryFolder(Path.Combine(RootPath, Path.GetRandomFileName())); AddItem(folder); return folder; } /// /// Creates a new temporary folder and returns the folder item. /// /// public virtual TemporaryFolder CreateFolder(String name) { TemporaryFolder folder = new TemporaryFolder(Path.Combine(RootPath, name)); AddItem(folder); return folder; } /// /// Creates a new temporary file and returns the file item. /// /// public virtual TemporaryFile CreateFile(String extension = null) { TemporaryFile file = new TemporaryFile(Path.Combine(RootPath, Path.GetRandomFileName() + extension)); AddItem(file); return file; } /// /// Creates a new temporary file but does not create it. /// /// public virtual TemporaryFile CreateImaginaryFile(String extension = null) { TemporaryFile file = new TemporaryFile(Path.Combine(RootPath, Path.GetRandomFileName() + extension), false); AddItem(file); return file; } /// /// Deletes all items. /// public virtual void Clean() { var items = Items; foreach (var item in items.Where(x => !x.Persist)) { item.Delete(); } } /// /// Deletes all items. /// public virtual Task CleanAsync() { return Task.Factory.StartNew(() => Clean()); } /// /// Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. /// public void Dispose() { if (!_disposed) { Clean(); _disposed = true; } } /// /// Finalizes an instance of the class. /// ~TemporaryManager() { Dispose(); } } }