//------------------------------------------------------------------------------
// <auto-generated>
// This code was generated by a tool.
// Tango Observables Generator
//
// Changes to this file may cause incorrect behavior and will be lost if
// the code is regenerated. Do not modify!
// </auto-generated>
//--------------------using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading.Tasks;
using Tango.Core.Helpers;
using Tango.FileSystem.Network;
using Tango.Logging;
namespace Tango.FileSystem
{
public class FileSystemManager
{
public FileSystemItemDTO GetRoot()
{
FileSystemItemDTO folder = new FileSystemItemDTO();
folder.Path = "This PC";
folder.IsRoot = true;
folder.Type = FileSystemItemType.Folder;
folder.Items = DriveInfo.GetDrives().Where(x => x.DriveType == DriveType.Fixed || x.DriveType == DriveType.Removable || x.DriveType == DriveType.Network).Select(x => new FileSystemItemDTO()
{
Path = x.RootDirectory.FullName,
DriveType = x.DriveType,
DriveLabel = $"{x.VolumeLabel} ({x.Name.Replace("\\", "")})",
Type = FileSystemItemType.Drive,
}).Cast<FileSystemItemDTO>().ToList();
return folder;
}
public FileSystemItemDTO GetFolder(GetFileSystemItemRequest request)
{
List<FileSystemItemDTO> items = new List<FileSystemItemDTO>();
if (request.SpecialFolder.HasValue)
{
request.Path = Environment.GetFolderPath(request.SpecialFolder.Value);
}
if (String.IsNullOrWhiteSpace(request.Path))
{
return GetRoot();
}
try
{
if (request.Path.Count(x => x == '%') == 2)
{
var variable = Regex.Match(request.Path, "(?<=%)(.*?)(?=%)").Value;
request.Path = request.Path.Replace($"%{variable}%", Environment.ExpandEnvironmentVariables($"%{variable}%"));
}
}
catch
{
throw new ArgumentException("Could not parse environment variable.");
}
request.Path = Path.GetFullPath(request.Path);
if (!Directory.Exists(request.Path))
{
throw new DirectoryNotFoundException("The specified directory could not be located.");
}
foreach (var directory in Directory.GetDirectories(request.Path))
{
items.Add(new FileSystemItemDTO()
{
Path = directory,
Type = FileSystemItemType.Folder,
DateModified = Directory.GetLastWriteTimeUtc(directory),
DateCreated = Directory.GetCreationTimeUtc(directory),
});
}
if (!request.FoldersOnly)
{
foreach (var file in Directory.GetFiles(request.Path, request.Filter != null ? request.Filter : "*.*"))
{
items.Add(new FileSystemItemDTO()
{
Path = file,
Type = FileSystemItemType.File,
DateModified = File.GetLastWriteTimeUtc(file),
DateCreated = File.GetCreationTimeUtc(file),
Size = new FileInfo(file).Length
});
}
}
return new FileSystemItemDTO()
{
Path = request.Path,
Type = request.Path.Length == 3 ? FileSystemItemType.Drive : FileSystemItemType.Folder,
Items = items
};
}
public Task<FileSystemItem> GetFolder(String path, bool foldersOnly = false, String filter = "*.*")
{
return Task.Factory.StartNew<FileSystemItem>(() =>
{
return FileSystemItem.FromDTO(GetFolder(new GetFileSystemItemRequest()
{
Path = path,
FoldersOnly = foldersOnly,
Filter = filter,
}));
});
}
public Task<FileSystemItem> GetFolder(Environment.SpecialFolder specialFolder, bool foldersOnly = false, String filter = "*.*")
{
return Task.Factory.StartNew<FileSystemItem>(() =>
{
return FileSystemItem.FromDTO(GetFolder(new GetFileSystemItemRequest()
{
SpecialFolder = specialFolder,
FoldersOnly = foldersOnly,
Filter = filter,
}));
});
}
public void Delete(String path)
{
if (Directory.Exists(path))
{
Directory.Delete(path, true);
}
else if (File.Exists(path))
{
File.Delete(path);
}
else
{
throw new FileNotFoundException("Could not locate the specified file or directory.");
}
}
public void Move(MoveRequest request)
{
if (Directory.Exists(request.Destination))
{
throw new IOException($"'{Path.GetFileName(request.Destination)}' already exists on the target folder.");
}
if (File.Exists(request.Source))
{
File.Move(request.Source, request.Destination);
}
else if (Directory.Exists(request.Source))
{
Directory.Move(request.Source, request.Destination);
}
else
{
throw new FileNotFoundException("Could not locate the source file or folder.");
}
}
public void Copy(CopyRequest request)
{
if (File.Exists(request.Source))
{
if (request.Source == request.Destination)
{
while (File.Exists(request.Destination))
{
request.Destination = Path.Combine(Path.GetDirectoryName(request.Destination), Path.GetFileNameWithoutExtension(request.Destination)) + " copy" + Path.GetExtension(request.Destination);
}
}
File.Copy(request.Source, request.Destination, true);
}
else if (Directory.Exists(request.Source))
{
Directory.CreateDirectory(Path.GetDirectoryName(request.Destination));
PathHelper.CopyDirectory(request.Source, request.Destination, true);
}
else
{
throw new FileNotFoundException("Could not locate the source file or folder.");
}
}
public FileSystemItemDTO CreateFolder(String path, String folderName)
{
String fullPath = Path.Combine(path, folderName);
if (Directory.Exists(fullPath))
{
throw new IOException("The specified directory name already exists.");
}
Directory.CreateDirectory(fullPath);
return GetFolder(new GetFileSystemItemRequest()
{
Path = fullPath
});
}
public long PerformDiskSpaceOptimization()
{
var tempDir = Path.GetTempPath();
var logsFolder = FileLogger.DefaultLogsFolder;
long sizeBefore = GetDirectorySize(new DirectoryInfo(tempDir)) + GetDirectorySize(new DirectoryInfo(logsFolder));
foreach (var file in Directory.GetFiles(tempDir, "*.*", SearchOption.AllDirectories))
{
try
{
FileInfo fileInfo = new FileInfo(file);
if (fileInfo.LastWriteTime < DateTime.Now.AddDays(-1))
{
File.Delete(file);
}
}
catch { }
}
foreach (var file in Directory.GetFiles(logsFolder, "*.*", SearchOption.AllDirectories))
{
try
{
FileInfo fileInfo = new FileInfo(file);
if (fileInfo.LastWriteTime < DateTime.Now.AddDays(-2))
{
File.Delete(file);
}
}
catch { }
}
long sizeAfter = GetDirectorySize(new DirectoryInfo(tempDir)) + GetDirectorySize(new DirectoryInfo(logsFolder));
return Math.Max(sizeBefore - sizeAfter, 0);
}
public static long GetDirectorySize(DirectoryInfo d)
{
long size = 0;
// Add file sizes.
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
size += fi.Length;
}
// Add subdirectory sizes.
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
size += GetDirectorySize(di);
}
return size;
}
}
}