public static SyncDatabase Initialize(string baseDir, string syncDbDir) { var localFiles = Directory.GetFiles(baseDir, "*", SearchOption.AllDirectories); var inside = syncDbDir.StartsWith(baseDir); var localInfos = localFiles.Select(i => { if (inside && i.StartsWith(syncDbDir)) { return(null); } { var hash = NetworkHelperSequential.HashFileAsync(new FileInfo(i)).Result; return(new SyncFileInfo { HashStr = hash.ToHashString(), RelativePath = i.Replace(baseDir, string.Empty).TrimStart(Path.DirectorySeparatorChar), AbsolutePath = i, State = SyncFileState.New, }); } }).Where(i => i != null).ToList(); return(new SyncDatabase { Files = localInfos, }); }
private static void CheckState(string baseDir, string syncDbDir, SyncDatabase syncDb) { var localFiles = Directory.GetFiles(baseDir, "*", SearchOption.AllDirectories).ToList(); var dbDirInBase = syncDbDir.StartsWith(baseDir); foreach (var stored in syncDb.Files) { var localFilePath = Path.Combine(baseDir, stored.RelativePath); var localFileIdx = localFiles.IndexOf(localFilePath); if (localFileIdx < 0) { stored.State = SyncFileState.Deleted; } else { var localFile = localFiles[localFileIdx]; localFiles.RemoveAt(localFileIdx); { var hash = NetworkHelperSequential.HashFileAsync(new FileInfo(localFile)).Result; var localFileHash = hash.ToHashString(); if (localFileHash != stored.HashStr) { stored.State = SyncFileState.Modified; stored.HashStr = localFileHash; } } } } var localInfos = localFiles.Select(localFile => { if (dbDirInBase && localFile.StartsWith(syncDbDir)) { return(null); } var localFileRelativePath = localFile.Replace(baseDir, string.Empty); { var hash = NetworkHelperSequential.HashFileAsync(new FileInfo(localFile)).Result; return(new SyncFileInfo { HashStr = hash.ToHashString(), RelativePath = localFileRelativePath.TrimStart(Path.DirectorySeparatorChar), AbsolutePath = localFile, State = SyncFileState.New, }); } }).Where(i => i != null).ToList(); syncDb.Files.AddRange(localInfos); }