Files
Mitria_Minecraft_Project/Mitria_Minecraft_Launcher/AuditFile.cs
2022-10-09 12:27:47 +09:00

91 lines
3.3 KiB
C#

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<FileDetail> GetLocalFileList(List<string> directorys)
{
List<DirectoryInfo> directoryInfos = new List<DirectoryInfo>();
foreach (string directory in directorys)
{
System.IO.DirectoryInfo directoryInfo = new DirectoryInfo(CommonLibrary.Extensions.PathCombineW(Settings.UserLauncherConfig.GameDirectory,Settings.NowProfile.ServerName, directory));
directoryInfos.Add(directoryInfo);
}
return GetLocalFileList(directoryInfos);
}
public List<FileDetail> GetLocalFileList(List<DirectoryInfo> directorys)
{
List<FileDetail> resultFiles = new List<FileDetail>();
List<FileInfo> files = new List<FileInfo>();
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(CommonLibrary.Extensions.PathCombineW(Settings.UserLauncherConfig.GameDirectory, Settings.NowProfile.ServerName) + "\\", "").Replace("\\", "/");
fileDetail.FileName = file.Name;
fileDetail.FileSize = file.Length;
fileDetail.HashCode = GetFileHash(file);
resultFiles.Add(fileDetail);
}
return resultFiles;
}
public List<FileDetail> GetRemoveFiles(List<FileDetail> oldFiles, List<FileDetail> newFiles)
{
List<FileDetail> removeFiles = new List<FileDetail>();
foreach (FileDetail oldFile in oldFiles)
{
if (!newFiles.Contains(oldFile))
{
removeFiles.Add(oldFile);
}
}
return removeFiles;
}
public List<FileDetail> GetNeedFiles(List<FileDetail> oldFiles, List<FileDetail> newFiles)
{
List<FileDetail> needFiles = new List<FileDetail>();
foreach (FileDetail newFile in newFiles)
{
if (!oldFiles.Contains(newFile))
{
needFiles.Add(newFile);
}
}
return needFiles;
}
}
}