public static string GetDirectoryHash(string directory, params string[] fileGlobPatterns) { ControlFlow.Assert(Directory.Exists(directory), $"Directory.Exists({directory})"); var files = (fileGlobPatterns.Length == 0 ? Directory.GetFiles(directory, "*", SearchOption.AllDirectories) : PathConstruction.GlobFiles(directory, fileGlobPatterns)) .OrderBy(x => x).ToList(); using (var md5 = MD5.Create()) { foreach (var file in files) { var relativePath = PathConstruction.GetRelativePath(directory, file); var unixNormalizedPath = PathConstruction.NormalizePath(relativePath, separator: '/'); var pathBytes = Encoding.UTF8.GetBytes(unixNormalizedPath); md5.TransformBlock(pathBytes, inputOffset: 0, inputCount: pathBytes.Length, outputBuffer: pathBytes, outputOffset: 0); var contentBytes = File.ReadAllBytes(file); md5.TransformBlock(contentBytes, inputOffset: 0, inputCount: contentBytes.Length, outputBuffer: contentBytes, outputOffset: 0); } md5.TransformFinalBlock(new byte[0], inputOffset: 0, inputCount: 0); return(BitConverter.ToString(md5.Hash).Replace("-", "").ToLower()); } }
public static void FtpUploadDirectoryRecursively(string directory, string hostRoot) { Log.Information("Uploading directory {Directory} to {HostRoot} ...", directory, hostRoot); var files = PathConstruction.GlobFiles(directory, "**/*").ToList(); for (var index = 0; index < files.Count; index++) { var file = files[index]; var relativePath = PathConstruction.GetRelativePath(directory, file); var hostPath = $"{hostRoot}/{relativePath}"; FtpUploadFileInternal(file, hostPath, $"[{index + 1}/{files.Count}] "); } }