aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
diff options
context:
space:
mode:
Diffstat (limited to 'Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs')
-rw-r--r--Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs261
1 files changed, 261 insertions, 0 deletions
diff --git a/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs b/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
new file mode 100644
index 000000000..dc8efa7dd
--- /dev/null
+++ b/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
@@ -0,0 +1,261 @@
+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;
+ }
+ }
+}