using CommonLibrary; using System.Collections.Generic; using System.IO; using System.Linq; using System.Security.Cryptography; using System.Text; namespace Mitria_Minecraft_Launcher { public class AuditFile { private string GetFileHash(FileInfo fileInfo) { using (MD5 md5 = MD5.Create()) { using (Stream stream = fileInfo.OpenRead()) { byte[] hashCode = md5.ComputeHash(stream); StringBuilder hashStringBuilder = new StringBuilder(); foreach (byte b in hashCode) { hashStringBuilder.AppendFormat("{0:x2}", b); } return hashStringBuilder.ToString(); } } } public List GetLocalFileList(List directorys) { List directoryInfos = new List(); foreach (string directory in directorys) { System.IO.DirectoryInfo directoryInfo = new DirectoryInfo(CommonLibrary.Extensions.PathCombineW(Settings.UserLauncherConfig.GameDirectory, directory)); directoryInfos.Add(directoryInfo); } return GetLocalFileList(directoryInfos); } public List GetLocalFileList(List directorys) { List resultFiles = new List(); List files = new List(); foreach (var directory in directorys) { if (!directory.Exists) { directory.Create(); } files.AddRange(directory.GetFiles("*.*", SearchOption.AllDirectories).ToArray()); } foreach (var file in files) { FileDetail fileDetail = new FileDetail(); fileDetail.Directory = file.DirectoryName.Replace(Settings.UserLauncherConfig.GameDirectory + "\\", "").Replace("\\", "/"); fileDetail.FileName = file.Name; fileDetail.FileSize = file.Length; fileDetail.HashCode = GetFileHash(file); resultFiles.Add(fileDetail); } return resultFiles; } public List GetRemoveFiles(List oldFiles, List newFiles) { List removeFiles = new List(); foreach (FileDetail oldFile in oldFiles) { if (!newFiles.Contains(oldFile)) { removeFiles.Add(oldFile); } } return removeFiles; } public List GetNeedFiles(List oldFiles, List newFiles) { List needFiles = new List(); foreach (FileDetail newFile in newFiles) { if (!oldFiles.Contains(newFile)) { needFiles.Add(newFile); } } return needFiles; } } }