aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.FileSystem/FileSystemManager.cs
blob: 44c8f1901892a3085ed737a096fdd8dfa23fc8bf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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.FileSystem.Network;

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.Name,
                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),
                });
            }

            foreach (var file in Directory.GetFiles(request.Path))
            {
                items.Add(new FileSystemItemDTO()
                {
                    Path = file,
                    Type = FileSystemItemType.File,
                    DateModified = File.GetLastWriteTimeUtc(file),
                    Size = new FileInfo(file).Length
                });
            }

            return new FileSystemItemDTO()
            {
                Path = request.Path,
                Type = request.Path.Length == 3 ? FileSystemItemType.Drive : FileSystemItemType.Folder,
                Items = items
            };
        }

        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.");
            }
        }
    }
}