private FileSystemPath GetBackupDirPath(ProgramDataSource source) { Logger.Trace("Getting directory for {0} with source {1}", DirPath, source); if (source == ProgramDataSource.Default) { Logger.Trace("Determined to use default directory based on source value"); return(DirPath); } if (source == ProgramDataSource.VirtualStore) { Logger.Trace("Determined to use VirtualStore directory based on source value"); return(VirtualStoreDirPath); } if (!VirtualStoreDirPath.DirectoryExists) { Logger.Trace("Determined to use default directory due to the VirtualStore directory not existing"); return(DirPath); } if (!DirPath.DirectoryExists) { Logger.Trace("Determined to use VirtualStore directory due to the default directory not existing"); return(VirtualStoreDirPath); } try { DateTime originalTime = GetLastWriteTime(new IOSearchPattern(DirPath, SearchOption, SearchPattern)); DateTime virtualStoreTime = GetLastWriteTime(new IOSearchPattern(VirtualStoreDirPath, SearchOption, SearchPattern)); if (originalTime > virtualStoreTime) { Logger.Trace("Determined to use default directory based on last write time"); return(DirPath); } else { Logger.Trace("Determined to use VirtualStore directory based on last write time"); return(VirtualStoreDirPath); } } catch (Exception ex) { Logger.Warn(ex, "Determining directory to use based on last write time"); // Use the VirtualStore path in case of error since this is most likely to work then return(VirtualStoreDirPath); } }
public IEnumerable <IOSearchPattern> GetWriteSearchPatterns(ProgramDataSource source) { if (source == ProgramDataSource.Auto) { // Return both paths if available. If the source if auto then we want to write to both locations. yield return(new IOSearchPattern(DirPath, SearchOption, SearchPattern)); if (HasVirtualStoreVersion) { yield return(new IOSearchPattern(VirtualStoreDirPath, SearchOption, SearchPattern)); } } else { yield return(GetReadSearchPattern(source)); } }
/// <summary> /// Refreshes the backup info /// </summary> /// <returns>The task</returns> public async Task RefreshAsync(ProgramDataSource dataSource) { ExistingBackups = await GetExistingBackupsAsync(); // Get the latest backup version to restore from LatestAvailableRestoreVersion = GetPrimaryBackup?.BackupVersion ?? -1; BackupDirectories = AllBackupDirectories.TryGetValue(LatestAvailableBackupVersion)?. Select(x => x.GetBackupReadSearchPattern(dataSource)). ToArray() ?? Array.Empty <BackupSearchPattern>(); RestoreDirectories = LatestAvailableRestoreVersion == -1 ? Array.Empty <BackupSearchPattern>() : AllBackupDirectories.TryGetValue(LatestAvailableRestoreVersion)?. SelectMany(x => x.GetBackupWriteSearchPatterns(dataSource)). ToArray() ?? Array.Empty <BackupSearchPattern>(); if (BackupDirectories.GroupBy(x => x.ID).Any(x => x.Count() > 1)) { throw new InvalidOperationException("Multiple backup directories can not use the same ID starting from version 13.0.0"); } }
public IOSearchPattern GetReadSearchPattern(ProgramDataSource source) { // Find and return a single matching directory path to use return(new IOSearchPattern(GetBackupDirPath(source), SearchOption, SearchPattern)); }
public BackupSearchPattern GetBackupReadSearchPattern(ProgramDataSource source) => new(ID, GetReadSearchPattern(source));