aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
diff options
context:
space:
mode:
authorShlomo Hecht <shlomo@twine-s.com>2020-04-02 10:15:32 +0300
committerShlomo Hecht <shlomo@twine-s.com>2020-04-02 10:15:32 +0300
commitf051c52a15f629c8fbea0038a1df4831e56101cf (patch)
treebf319615e3aa5a69a702a7ac662614c73f64b5a0 /Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
parentada2ce25bd36b6f7b3c8aa01039cc9611b22e55c (diff)
parent44c91de2b71d128d9b47e240ee6f4e58b6b8544e (diff)
downloadTango-f051c52a15f629c8fbea0038a1df4831e56101cf.tar.gz
Tango-f051c52a15f629c8fbea0038a1df4831e56101cf.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/Tango/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs')
-rw-r--r--Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs165
1 files changed, 157 insertions, 8 deletions
diff --git a/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs b/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
index 44c8f1901..c08304ca8 100644
--- a/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
+++ b/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
@@ -5,7 +5,9 @@ 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
{
@@ -21,7 +23,7 @@ namespace Tango.FileSystem
{
Path = x.RootDirectory.FullName,
DriveType = x.DriveType,
- DriveLabel = x.Name,
+ DriveLabel = $"{x.VolumeLabel} ({x.Name.Replace("\\", "")})",
Type = FileSystemItemType.Drive,
}).Cast<FileSystemItemDTO>().ToList();
@@ -72,15 +74,18 @@ namespace Tango.FileSystem
});
}
- foreach (var file in Directory.GetFiles(request.Path))
+ if (!request.FoldersOnly)
{
- items.Add(new FileSystemItemDTO()
+ foreach (var file in Directory.GetFiles(request.Path, request.Filter != null ? request.Filter : "*.*"))
{
- Path = file,
- Type = FileSystemItemType.File,
- DateModified = File.GetLastWriteTimeUtc(file),
- Size = new FileInfo(file).Length
- });
+ items.Add(new FileSystemItemDTO()
+ {
+ Path = file,
+ Type = FileSystemItemType.File,
+ DateModified = File.GetLastWriteTimeUtc(file),
+ Size = new FileInfo(file).Length
+ });
+ }
}
return new FileSystemItemDTO()
@@ -91,6 +96,32 @@ namespace Tango.FileSystem
};
}
+ 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))
@@ -106,5 +137,123 @@ namespace Tango.FileSystem
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;
+ }
}
}