private void HandleAddedFile(UpdaterDefinitionEntry entry) { var filePath = PathsManager.Combine(_context.Settings.RootPath, entry.RelativePath); var difference = FileValidityDifference.None; var alreadyExisting = FilesManager.Exists(filePath); if (alreadyExisting && IsValid(entry, out difference)) { return; } if (difference.HasFlag(FileValidityDifference.Size)) { if (FilesManager.IsFileLocked(filePath)) { var newFilePath = FilesManager.GetTemporaryDeletingFileName(filePath); FilesManager.Rename(filePath, newFilePath); } else { FilesManager.Delete(filePath); } Downloader.Download(_context.Settings.GetRemoteUpdaterFileUrl(entry.RelativePath), PathsManager.GetDirectoryPath(filePath)); EnsureDefinition(entry); _context.SetDirtyFlag(entry.RelativePath); } else { if (!alreadyExisting) { Downloader.Download(_context.Settings.GetRemoteUpdaterFileUrl(entry.RelativePath), PathsManager.GetDirectoryPath(filePath)); } if (FilesManager.IsFileLocked(filePath)) { var newFilePath = FilesManager.GetTemporaryDeletingFileName(filePath); FilesManager.Rename(filePath, newFilePath); FilesManager.Copy(newFilePath, filePath); } EnsureDefinition(entry); } }
private void HandleUpdatedFile(PatchDefinitionEntry entry) { var fromFile = PathsManager.Combine(_context.Settings.GetGameFolderPath(_context.VersionFrom), entry.RelativePath); var toFile = PathsManager.Combine(_context.Settings.GetGameFolderPath(_context.VersionTo), entry.RelativePath); var patchFile = PathsManager.Combine(_context.Settings.GetPatchesTempFolderPath(), entry.RelativePath + ".patch"); var signatureFile = PathsManager.Combine(_context.Settings.GetPatchesTempFolderPath(), entry.RelativePath + ".signature"); DirectoriesManager.Create(PathsManager.GetDirectoryPath(patchFile)); DeltaFileBuilder.Build(fromFile, toFile, patchFile, signatureFile); var path = PathsManager.Combine(_context.Settings.GetGameFolderPath(_context.VersionTo), entry.RelativePath); var info = FilesManager.GetFileInfo(path); entry.Attributes = info.Attributes; entry.LastWriting = info.LastWriting; }
private void HandleChangedAttributesFile(UpdaterDefinitionEntry entry) { var filePath = PathsManager.Combine(_context.Settings.RootPath, entry.RelativePath); if (!FilesManager.Exists(filePath)) { Downloader.Download(_context.Settings.GetRemoteUpdaterFileUrl(entry.RelativePath), PathsManager.GetDirectoryPath(filePath)); } else { if (FilesManager.IsFileLocked(filePath)) { var newFilePath = FilesManager.GetTemporaryDeletingFileName(filePath); FilesManager.Rename(filePath, newFilePath); FilesManager.Copy(newFilePath, filePath); } } EnsureDefinition(entry); }
public void Update() { _context.Logger.Info("Repairing process started."); var repairedFiles = 0; var downloadEntries = new List <DownloadEntry>(); foreach (var currentEntry in _context.CurrentBuildDefinition.Entries) { var canSkip = false; var integrity = GetFileIntegrity(currentEntry); var filePath = PathsManager.Combine(_context.Settings.GetGamePath(), currentEntry.RelativePath); if (integrity == FileIntegrity.Valid) { canSkip = true; } else if (integrity == FileIntegrity.InvalidAttributes) { HandleInvalidAttributes(currentEntry); canSkip = true; } else if (integrity == FileIntegrity.InvalidLastWriting || integrity == (FileIntegrity.InvalidLastWriting | FileIntegrity.InvalidAttributes)) { var isNowValid = HandleInvalidLastWriting(currentEntry); if (isNowValid) { SetDefinition(filePath, currentEntry); canSkip = true; } } else if (integrity.HasFlag(FileIntegrity.InvalidSize)) { FilesManager.Delete(currentEntry.RelativePath); } if (!canSkip) { // If I am here, the file cannot be fixed and it does not exist anymore (or never existed) DirectoriesManager.Create(PathsManager.GetDirectoryPath(filePath)); var remoteFile = PathsManager.UriCombine( _context.Settings.GetRemoteBuildUrl(_context.CurrentVersion), _context.Settings.GameFolderName, currentEntry.RelativePath ); var partialRemoteFile = PathsManager.UriCombine( _context.Settings.GetPartialRemoteBuildUrl(_context.CurrentVersion), _context.Settings.GameFolderName, currentEntry.RelativePath ); downloadEntries.Add(new DownloadEntry( remoteFile, partialRemoteFile, PathsManager.GetDirectoryPath(filePath), filePath, currentEntry) ); repairedFiles++; } } Downloader.Download(downloadEntries, (entry) => { SetDefinition(entry.DestinationFile, entry.Definition); _context.ReportProgress($"Repaired {entry.Definition.RelativePath}"); }); _context.Logger.Info("Repairing process completed. Checked {CheckedFiles} files, repaired {RepairedFiles} files, skipped {SkippedFiles} files.", _context.CurrentBuildDefinition.Entries.Length, repairedFiles, _context.CurrentBuildDefinition.Entries.Length - repairedFiles); }