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();
}
}
}