예제 #1
0
        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 = NetworkHelper.HashFileAsync(new FileInfo(i)).Result;

                    return(new SyncFileInfo
                    {
                        HashStr = hash.ToHashString(),
                        RelativePath = i.Replace(baseDir, string.Empty).TrimStart(Path.DirectorySeparatorChar),
                        State = SyncFileState.New,
                    });
                }
            }).Where(i => i != null).ToList();

            return(new SyncDatabase
            {
                Files = localInfos,
            });
        }
예제 #2
0
        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 = NetworkHelper.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 = NetworkHelper.HashFileAsync(new FileInfo(localFile)).Result;

                    return(new SyncFileInfo
                    {
                        HashStr = hash.ToHashString(),
                        RelativePath = localFileRelativePath.TrimStart(Path.DirectorySeparatorChar),
                        State = SyncFileState.New,
                    });
                }
            }).Where(i => i != null).ToList();

            syncDb.Files.AddRange(localInfos);
        }