179 lines
5.5 KiB
C#
179 lines
5.5 KiB
C#
|
using System.IO.Compression;
|
|||
|
using MasstransferCommon.Utils;
|
|||
|
using MasstransferInfrastructure.OTA.Model;
|
|||
|
|
|||
|
namespace MasstransferInfrastructure.OTA.Client;
|
|||
|
|
|||
|
public class OTAClient
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 检查更新
|
|||
|
/// </summary>
|
|||
|
/// <param name="updateUrl"></param>
|
|||
|
/// <returns></returns>
|
|||
|
public async Task<UpdateInfo?> CheckForUpdate(string updateUrl)
|
|||
|
{
|
|||
|
return await ApiClient.GetAsync<UpdateInfo>(updateUrl);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 下载更新
|
|||
|
/// </summary>
|
|||
|
/// <param name="downloadUrl"></param>
|
|||
|
/// <param name="filePath"></param>
|
|||
|
public async Task DownloadUpdateAsync(string downloadUrl, string filePath)
|
|||
|
{
|
|||
|
await ApiClient.DownloadFileAsync(downloadUrl, filePath);
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 备份保存重要文件
|
|||
|
/// </summary>
|
|||
|
/// <param name="sourceDir">源地址</param>
|
|||
|
/// <param name="destinationDir">目标地址</param>
|
|||
|
/// <param name="fileExtension">保存文件扩展名</param>
|
|||
|
/// <param name="logFileDir">保存文件日志</param>
|
|||
|
public void BackupEssentialFiles(string sourceDir, string destinationDir, string[] fileExtension, string logFileDir)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// 获取当前目录的所有文件
|
|||
|
string[] files = Directory.GetFiles(sourceDir);
|
|||
|
|
|||
|
//遍历当前目录文件是否是重要文件
|
|||
|
foreach (string file in files)
|
|||
|
{
|
|||
|
string extension = Path.GetExtension(file).ToLower();
|
|||
|
if (Array.Exists(fileExtension, ext => ext.Equals(extension, StringComparison.OrdinalIgnoreCase)))
|
|||
|
{
|
|||
|
// 备份文件到新目录
|
|||
|
string destFile = Path.Combine(destinationDir, Path.GetFileName(file));
|
|||
|
File.Copy(file, destFile, true);
|
|||
|
|
|||
|
// 记录文件的源地址
|
|||
|
File.AppendAllText(logFileDir, $"{file}\n");
|
|||
|
}
|
|||
|
}
|
|||
|
// 递归遍历子文件夹
|
|||
|
string[] directories = Directory.GetDirectories(sourceDir);
|
|||
|
foreach (string directory in directories)
|
|||
|
{
|
|||
|
BackupEssentialFiles(directory, destinationDir,fileExtension, logFileDir);
|
|||
|
}
|
|||
|
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine($"An error occurred: {ex.Message}");
|
|||
|
|
|||
|
// 失败则删除重要文件备分
|
|||
|
if (Directory.Exists(destinationDir))
|
|||
|
{
|
|||
|
DeleteDirectory(destinationDir);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 恢复重要文件
|
|||
|
/// </summary>
|
|||
|
/// <param name="logFileDir">重要文件备份日志</param>
|
|||
|
public void RecoverCriticalFiles(string logFileDir)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
// 恢复备份
|
|||
|
using (StreamReader reader = new StreamReader(logFileDir))
|
|||
|
{
|
|||
|
string line;
|
|||
|
while ((line = reader.ReadLine()) != null)
|
|||
|
{
|
|||
|
var currentFilePath = Path.Combine(Path.GetDirectoryName(logFileDir), Path.GetFileName(line));
|
|||
|
File.Copy(currentFilePath,line, true);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
//删除重要文件备份
|
|||
|
DeleteDirectory(Path.GetDirectoryName(logFileDir));
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine($"读取失败: {ex.Message}");
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 压缩目录
|
|||
|
/// </summary>
|
|||
|
/// <param name="sourceDir">源目录地址</param>
|
|||
|
/// <param name="zipFilePath">压缩文件保存地址</param>
|
|||
|
public void CompressDirectory(string sourceDir, string zipFilePath)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
if (File.Exists(zipFilePath))
|
|||
|
{
|
|||
|
File.Delete(zipFilePath);
|
|||
|
}
|
|||
|
ZipFile.CreateFromDirectory(sourceDir, zipFilePath, CompressionLevel.Fastest, false);
|
|||
|
}
|
|||
|
catch(Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine($"An error occurred: {ex.Message}");
|
|||
|
|
|||
|
// 失败,则删除损坏或者部分创建的压缩包
|
|||
|
if (File.Exists(zipFilePath))
|
|||
|
{
|
|||
|
DeleteFile(zipFilePath);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 解压缩目录
|
|||
|
/// </summary>
|
|||
|
/// <param name="zipFilePath">压缩文件地址</param>
|
|||
|
/// <param name="extractPath">解压目录</param>
|
|||
|
public void ExtractDirectory(string zipFilePath, string extractPath)
|
|||
|
{
|
|||
|
try
|
|||
|
{
|
|||
|
ZipFile.ExtractToDirectory(zipFilePath, extractPath);
|
|||
|
}
|
|||
|
catch (Exception ex)
|
|||
|
{
|
|||
|
Console.WriteLine($"解压失败: {ex.Message}");
|
|||
|
|
|||
|
// 失败,则删除可能产生的文件
|
|||
|
if (Directory.Exists(extractPath))
|
|||
|
{
|
|||
|
DeleteDirectory(extractPath);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 删除目录
|
|||
|
/// </summary>
|
|||
|
/// <param name="sourceDir">删除目录地址</param>
|
|||
|
public void DeleteDirectory(string sourceDir)
|
|||
|
{
|
|||
|
if (Directory.Exists(sourceDir))
|
|||
|
{
|
|||
|
// 删除目录中的所有文件
|
|||
|
Directory.Delete(sourceDir, recursive: true);
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
/// <summary>
|
|||
|
/// 删除文件
|
|||
|
/// </summary>
|
|||
|
/// <param name="sourceDir">删除文件地址</param>
|
|||
|
public void DeleteFile(string sourceDir)
|
|||
|
{
|
|||
|
if (File.Exists(sourceDir))
|
|||
|
{
|
|||
|
File.Delete(sourceDir);
|
|||
|
}
|
|||
|
}
|
|||
|
}
|