RevokeMsgPatcher/RevokeMsgPatcher/Modifier/FileHexEditor.cs
huiyadanli 5ed38573de [#] 修改当前备份逻辑,相同版本dll只做一次备份!
原因: 可选功能补丁允许在非原版dll上做多次安装补丁操作。
2020-07-19 17:06:32 +08:00

122 lines
3.1 KiB
C#

using RevokeMsgPatcher.Model;
using RevokeMsgPatcher.Utils;
using System.Collections.Generic;
using System.IO;
namespace RevokeMsgPatcher.Modifier
{
public class FileHexEditor
{
public string FileName { get; set; }
public string FilePath { get; set; }
public string FileBakPath { get; set; }
private string fileReplacedPath;
private string version;
public string FileVersion
{
get
{
if (version == null)
{
version = FileUtil.GetFileVersion(FilePath);
}
return version;
}
}
public string BackupFileVersion
{
get
{
return FileUtil.GetFileVersion(FileBakPath);
}
}
public string sha1;
public string FileSHA1
{
get
{
if (sha1 == null)
{
sha1 = FileUtil.ComputeFileSHA1(FilePath);
}
return sha1;
}
}
public TargetInfo FileTargetInfo { get; set; }
/// <summary>
/// 通过比对SHA1得到的特定版本的修改信息
/// </summary>
public ModifyInfo FileModifyInfo { get; set; }
/// <summary>
/// 通过比对版本范围得到的通用查找替换的修改信息(特征码替换信息)
/// </summary>
public CommonModifyInfo FileCommonModifyInfo { get; set; }
/// <summary>
/// 将要执行的修改
/// </summary>
public List<Change> TargetChanges { get; set; }
public FileHexEditor(string installPath, TargetInfo target)
{
FileTargetInfo = target.Clone();
FileName = FileTargetInfo.Name;
FilePath = Path.Combine(installPath, FileTargetInfo.RelativePath);
FileBakPath = FilePath + ".h.bak";
fileReplacedPath = FilePath + ".h.process";
}
/// <summary>
/// 备份
/// </summary>
public void Backup()
{
// 不覆盖同版本的备份文件
if (File.Exists(FileBakPath))
{
if (FileVersion != BackupFileVersion)
{
File.Copy(FilePath, FileBakPath, true);
}
}
else
{
File.Copy(FilePath, FileBakPath, true);
}
}
/// <summary>
/// 打补丁
/// </summary>
/// <returns></returns>
public bool Patch()
{
if (TargetChanges == null)
{
throw new BusinessException("change_null", "在安装补丁时,变更的内容为空!");
}
FileUtil.EditMultiHex(FilePath, TargetChanges);
return true;
}
/// <summary>
/// 还原
/// </summary>
public void Restore()
{
File.Copy(FileBakPath, FilePath, true);
}
}
}