aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MainView.xaml
diff options
context:
space:
mode:
authorAvi Levkovich <avi@twine-s.com>2019-01-31 12:19:56 +0200
committerAvi Levkovich <avi@twine-s.com>2019-01-31 12:19:56 +0200
commitf82417102b1ff375d162d5792315d69ff9c15e98 (patch)
tree1feddc4ae6c36f7ea9ebaf45e15a633aaea5af3b /Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MainView.xaml
parent5cd9897dc2d3374d3b9941e2c959ef01aef029d6 (diff)
parent1dcf48d11246dcc69ca28dbb345cb53b12b7d7de (diff)
downloadTango-f82417102b1ff375d162d5792315d69ff9c15e98.tar.gz
Tango-f82417102b1ff375d162d5792315d69ff9c15e98.zip
Merge branch 'master' of https://twinetfs.visualstudio.com/_git/Tango
Diffstat (limited to 'Software/Visual_Studio/MachineStudio/Modules/Tango.MachineStudio.Synchronization/Views/MainView.xaml')
0 files changed, 0 insertions, 0 deletions
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;
        }
    }
}