-
Notifications
You must be signed in to change notification settings - Fork 10
Expand file tree
/
Copy pathUpdateExistingFilesBackuper.cs
More file actions
130 lines (110 loc) · 5.22 KB
/
UpdateExistingFilesBackuper.cs
File metadata and controls
130 lines (110 loc) · 5.22 KB
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
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
using System.IO;
using System.Threading;
using ByteSync.Business.Updates;
using ByteSync.Interfaces.Repositories.Updates;
using ByteSync.Interfaces.Updates;
namespace ByteSync.Services.Updates;
public class UpdateExistingFilesBackuper : IUpdateExistingFilesBackuper
{
private readonly IUpdateRepository _updateRepository;
private readonly ILogger<UpdateExistingFilesBackuper> _logger;
public UpdateExistingFilesBackuper(IUpdateRepository updateRepository, ILogger<UpdateExistingFilesBackuper> logger)
{
_updateRepository = updateRepository;
_logger = logger;
BackedUpFileSystemInfos = new List<Tuple<string, string>>();
}
public List<Tuple<string, string>> BackedUpFileSystemInfos { get; }
public Task BackupExistingFilesAsync(CancellationToken cancellationToken)
{
return Task.Run(() =>
{
try
{
var applicationBaseDirectoryInfo = new DirectoryInfo(_updateRepository.UpdateData.ApplicationBaseDirectory);
var filesToBackup = GetFilesToBackup(applicationBaseDirectoryInfo, cancellationToken);
foreach (var fileSystemInfo in filesToBackup)
{
if (cancellationToken.IsCancellationRequested)
{
_logger.LogWarning("UpdateExistingFilesBackuper.BackupExistingFiles: Cancellation requested");
return;
}
BackupFileSystemInfo(fileSystemInfo);
}
}
catch (OperationCanceledException)
{
_logger.LogWarning("UpdateExistingFilesBackuper.BackupExistingFiles: Operation was canceled");
}
catch (Exception ex)
{
_logger.LogError(ex, "UpdateExistingFilesBackuper.BackupExistingFiles: An error occurred");
throw;
}
}, cancellationToken);
}
private IEnumerable<FileSystemInfo> GetFilesToBackup(DirectoryInfo baseDirectory, CancellationToken cancellationToken)
{
var result = new List<FileSystemInfo>();
foreach (var fileSystemInfo in baseDirectory.GetFileSystemInfos())
{
if (cancellationToken.IsCancellationRequested)
break;
if (fileSystemInfo is DirectoryInfo directoryInfo)
{
// Only include files specifically named “Contents” or “ByteSync.app”
if (directoryInfo.Name.Equals("Contents", StringComparison.InvariantCultureIgnoreCase) ||
directoryInfo.Name.Equals("ByteSync.app", StringComparison.InvariantCultureIgnoreCase))
{
result.Add(fileSystemInfo);
}
else
{
_logger.LogInformation("UpdateExistingFilesBackuper.GetFilesToBackup: ignored directory {directory}", fileSystemInfo.FullName);
}
}
else if (fileSystemInfo is FileInfo fileInfo)
{
// Only include files that:
// - Contain “ByteSync” in their name
// - Do not have a .log, .dat, .xml, .json or .zip extension
// - Do not start with “unins” if the extension is .exe
bool containsByteSyncName = fileInfo.Name.Contains("ByteSync", StringComparison.InvariantCultureIgnoreCase);
bool hasAllowedExtension = !fileInfo.Extension.ToLower().In(".log", ".dat", ".xml", ".json", ".zip");
bool isUninstaller = fileInfo.Name.StartsWith("unins", StringComparison.InvariantCultureIgnoreCase)
&& fileInfo.Extension.Equals(".exe", StringComparison.InvariantCultureIgnoreCase);
if (containsByteSyncName && hasAllowedExtension && !isUninstaller)
{
result.Add(fileSystemInfo);
}
else
{
_logger.LogInformation("UpdateExistingFilesBackuper.GetFilesToBackup: ignored file {file}", fileSystemInfo.FullName);
}
}
}
return result;
}
private void BackupFileSystemInfo(FileSystemInfo fileSystemInfo)
{
string previousFullName = fileSystemInfo.FullName;
int cpt = 0;
var backupDestination = $"{fileSystemInfo.FullName}.{UpdateConstants.BAK_EXTENSION}{cpt}";
while (File.Exists(backupDestination) || Directory.Exists(backupDestination))
{
cpt += 1;
backupDestination = $"{fileSystemInfo.FullName}.{UpdateConstants.BAK_EXTENSION}{cpt}";
}
_logger.LogInformation("UpdateExistingFilesBackuper: Renaming {Source} to {Destination}", previousFullName, backupDestination);
if (fileSystemInfo is FileInfo fileInfo)
{
fileInfo.MoveTo(backupDestination);
}
else if (fileSystemInfo is DirectoryInfo directoryInfo)
{
directoryInfo.MoveTo(backupDestination);
}
BackedUpFileSystemInfos.Add(new Tuple<string, string>(previousFullName, backupDestination));
}
}