using System.IO.Compression;
using MasstransferCommon.Utils;
using MasstransferInfrastructure.OTA.Model;
namespace MasstransferInfrastructure.OTA.Client;
public class OTAClient
{
///
/// 检查更新
///
///
///
public async Task CheckForUpdate(string updateUrl)
{
return await ApiClient.GetAsync(updateUrl);
}
///
/// 下载更新
///
///
///
public async Task DownloadUpdateAsync(string downloadUrl, string filePath)
{
await ApiClient.DownloadFileAsync(downloadUrl, filePath);
}
///
/// 备份保存重要文件
///
/// 源地址
/// 目标地址
/// 保存文件扩展名
/// 保存文件日志
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);
}
}
}
///
/// 恢复重要文件
///
/// 重要文件备份日志
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}");
}
}
///
/// 压缩目录
///
/// 源目录地址
/// 压缩文件保存地址
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);
}
}
}
///
/// 解压缩目录
///
/// 压缩文件地址
/// 解压目录
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);
}
}
}
///
/// 删除目录
///
/// 删除目录地址
public void DeleteDirectory(string sourceDir)
{
if (Directory.Exists(sourceDir))
{
// 删除目录中的所有文件
Directory.Delete(sourceDir, recursive: true);
}
}
///
/// 删除文件
///
/// 删除文件地址
public void DeleteFile(string sourceDir)
{
if (File.Exists(sourceDir))
{
File.Delete(sourceDir);
}
}
}