Files
lightsetup/LightSetupMd5/Md5Release.cs
2023-05-22 09:29:58 +08:00

95 lines
2.8 KiB
C#

using LightSetupBase;
using LightSetupMd5;
using System.Text;
using System.Security.Cryptography;
using System.Collections.Generic;
using System;
namespace LightSetupMd5
{
internal class Md5Release
{
public string GetMd5(Md5MainArgs arg, List<FileInfo> fileInfos)
{
List<Md5FileInfo> fileInfo = new List<Md5FileInfo>();
foreach (FileInfo file in fileInfos)
{
fileInfo.Add(new Md5FileInfo(Md5(file), getFilePath(arg, file)));
}
return filesToMd5(fileInfo);
}
private string Md5(FileInfo file)
{
try
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal;
using (FileStream fileStream = file.OpenRead())
{
retVal = md5.ComputeHash(fileStream);
fileStream.Close();
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
string fileMd5 = sb.ToString();
Console.WriteLine("文件" + file.FullName + "的md5值为" + fileMd5);
return fileMd5;
}
catch (Exception ex)
{
throw new Exception("GetMD5HashFromFile() fail,error:" + ex.Message);
}
}
private string getFilePath(Md5MainArgs arg, FileInfo file)
{
return file.FullName.Substring(arg.RunPath.Length);
}
private string filesToMd5(List<Md5FileInfo> fileInfo)
{
//升序
fileInfo.Sort((a, b) => (a.Md5 + a.AbsolutePath).CompareTo(b.Md5 + b.AbsolutePath));
StringBuilder sb = new StringBuilder();
foreach (Md5FileInfo file in fileInfo)
{
if (sb.Length > 0)
{
sb.Append(":");
}
sb.Append(file.Md5);
sb.Append("_");
sb.Append(file.AbsolutePath);
}
string md5 = textMd5(sb.ToString());
Console.WriteLine("整个目录的md5值为:" + md5);
return md5;
}
private string textMd5(string text)
{
StringBuilder sb = new StringBuilder();
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
byte[] data = md5.ComputeHash(Encoding.UTF8.GetBytes(text));
int length = data.Length;
for (int i = 0; i < length; i++)
{
sb.Append(data[i].ToString("x2"));
}
return (sb.ToString());
}
}
}
}