예제 #1
0
        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());
            }
        }
예제 #2
0
파일: FtpTasks.cs 프로젝트: nuke-build/nuke
        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}] ");
            }
        }