x86和x64

This commit is contained in:
2025-06-29 19:14:04 +08:00
parent cf20942533
commit 7060ef38bb
5 changed files with 113 additions and 65 deletions

BIN
7z-x64.dll Normal file

Binary file not shown.

BIN
7z-x86.dll Normal file

Binary file not shown.

BIN
7z.dll

Binary file not shown.

View File

@@ -184,7 +184,8 @@
</BootstrapperPackage>
</ItemGroup>
<ItemGroup>
<EmbeddedResource Include="7z.dll" />
<EmbeddedResource Include="7z-x86.dll" />
<EmbeddedResource Include="7z-x64.dll" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">

175
Form1.cs
View File

@@ -231,10 +231,10 @@ namespace CheckDownload
UpdateCount("");
UpdateSize("");
UpdateProgressValue(100);
// 无需更新时清理临时文件夹
CleanupTempDirectory();
// 显示更新完成并等待2秒
UpdateStatus("更新完成");
await Task.Delay(2000);
@@ -270,9 +270,9 @@ namespace CheckDownload
if (_completedCount == 0 && orderedFileList.Count > 0)
{
throw new Exception("所有文件下载失败。");
throw new Exception("所有文件下载失败。");
}
await VerifyAndSaveAllFiles();
await DecompressTim7zAsync();
@@ -379,7 +379,7 @@ namespace CheckDownload
{
string key = onlineProperty.Name;
JToken onlineValue = onlineProperty.Value;
string relativePath = string.IsNullOrEmpty(currentPath) ? key : Path.Combine(currentPath, key);
string localFullPath = Path.Combine(_baseDirectory, relativePath);
@@ -445,9 +445,9 @@ namespace CheckDownload
if (_completedCount == 0 && fileList.Count > 0)
{
throw new Exception("所有文件下载失败。");
throw new Exception("所有文件下载失败。");
}
await VerifyAndSaveAllFiles();
}
@@ -472,10 +472,10 @@ namespace CheckDownload
_downloadedFiles[file.Key] = file.Value;
}
Interlocked.Increment(ref _completedCount);
int progress = (int)((double)_completedCount / _totalCount * 95);
UpdateProgressValue(progress);
UpdateStatus($"{Path.GetFileName(file.Key)}");
UpdateCount($"{_completedCount}/{_totalCount}");
}
@@ -491,7 +491,7 @@ namespace CheckDownload
});
await Task.WhenAll(downloadTasks);
}
/// <summary>
/// 尝试从多个数据源下载单个文件优先使用123盘OSS作为备用
/// </summary>
@@ -516,13 +516,13 @@ namespace CheckDownload
{
return true;
}
UpdateStatus($"{fileName}");
UpdateCount($"{_completedCount + 1}/{_totalCount}");
string ossKey = $"File/{expectedMd5}";
var obj = _ossClient.GetObject(OssBucketName, ossKey);
string tempDir = Path.GetDirectoryName(tempFilePath);
if (!Directory.Exists(tempDir))
{
@@ -567,9 +567,9 @@ namespace CheckDownload
}
UpdateStatus($"检查已存在的临时文件: {fileName}");
string actualMd5 = await Task.Run(() => CalculateMD5FromFile(tempFilePath));
if (actualMd5.Equals(expectedMd5, StringComparison.OrdinalIgnoreCase))
{
UpdateStatus($"临时文件完整,跳过下载: {fileName}");
@@ -613,16 +613,16 @@ namespace CheckDownload
UpdateStatus($"正在从123盘下载: {fileName}");
UpdateCount("");
UpdateSize("");
string authUrl = GenerateAuthUrl($"http://{OneDriveMainDomain}{OneDrivePath}", fileName);
UpdateStatus($"使用主域名下载文件...");
UpdateCount("");
UpdateSize("");
var request = new HttpRequestMessage(HttpMethod.Get, authUrl) { Version = HttpVersion.Version11 };
request.Headers.Add("User-Agent", "CheckDownload/1.0");
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
@@ -637,7 +637,7 @@ namespace CheckDownload
{
await DownloadWithProgressAsync(remote, localFile, response.Content.Headers.ContentLength);
}
UpdateStatus($"123盘主域名下载成功: {fileName}");
UpdateCount("");
UpdateSize("");
@@ -656,16 +656,16 @@ namespace CheckDownload
UpdateStatus($"正在从123盘备用域名下载: {fileName}");
UpdateCount("");
UpdateSize("");
string authUrl = GenerateAuthUrl($"http://{OneDriveBackupDomain}{OneDrivePath}", fileName);
UpdateStatus($"使用备用域名下载文件...");
UpdateCount("");
UpdateSize("");
var request = new HttpRequestMessage(HttpMethod.Get, authUrl) { Version = HttpVersion.Version11 };
request.Headers.Add("User-Agent", "CheckDownload/1.0");
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
@@ -680,7 +680,7 @@ namespace CheckDownload
{
await DownloadWithProgressAsync(remote, localFile, response.Content.Headers.ContentLength);
}
UpdateStatus($"123盘备用域名下载成功: {fileName}");
UpdateCount("");
UpdateSize("");
@@ -704,14 +704,14 @@ namespace CheckDownload
private async Task<bool> DownloadFileFromOneDrive(string filePath, string expectedMd5, string localPath)
{
string fileName = $"File/{expectedMd5}";
try
{
string authUrl = GenerateAuthUrl($"http://{OneDriveMainDomain}{OneDrivePath}", fileName);
var request = new HttpRequestMessage(HttpMethod.Get, authUrl) { Version = HttpVersion.Version11 };
request.Headers.Add("User-Agent", "CheckDownload/1.0");
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
@@ -726,7 +726,7 @@ namespace CheckDownload
{
await DownloadWithProgressAsync(remote, localFile, response.Content.Headers.ContentLength);
}
return true;
}
}
@@ -737,10 +737,10 @@ namespace CheckDownload
try
{
string authUrl = GenerateAuthUrl($"http://{OneDriveBackupDomain}{OneDrivePath}", fileName);
var request = new HttpRequestMessage(HttpMethod.Get, authUrl) { Version = HttpVersion.Version11 };
request.Headers.Add("User-Agent", "CheckDownload/1.0");
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
{
response.EnsureSuccessStatusCode();
@@ -755,7 +755,7 @@ namespace CheckDownload
{
await DownloadWithProgressAsync(remote, localFile, response.Content.Headers.ContentLength);
}
return true;
}
}
@@ -780,9 +780,9 @@ namespace CheckDownload
UpdateCount("");
UpdateSize("");
var failedThisRound = new ConcurrentDictionary<string, string>();
await PerformDownloads(filesToRetry, failedThisRound);
filesToRetry = new Dictionary<string, string>(failedThisRound);
if (filesToRetry.Any() && i < MaxDownloadRetries - 1)
@@ -834,7 +834,7 @@ namespace CheckDownload
UpdateStatus($"所有DNS服务器均无法解析域名: {domain}");
return new List<string>();
}
/// <summary>
/// 验证所有下载文件的MD5完整性并保存到目标位置处理文件占用情况
/// </summary>
@@ -914,7 +914,7 @@ namespace CheckDownload
UpdateProgressValue(100);
}
}
/// <summary>
/// 尝试将文件从临时位置移动到目标位置(异步),若文件被占用则等待一秒后重试一次
/// </summary>
@@ -952,7 +952,7 @@ namespace CheckDownload
return false;
}
}
/// <summary>
/// 为被占用文件创建批处理脚本,在程序退出后自动完成文件替换
/// </summary>
@@ -985,9 +985,9 @@ namespace CheckDownload
batchContent.AppendLine("del \"%~f0\" /f /q");
batchContent.AppendLine("exit");
File.WriteAllText(batchFilePath, batchContent.ToString(), new UTF8Encoding(false));
var startInfo = new ProcessStartInfo
{
FileName = "cmd.exe",
@@ -1104,7 +1104,7 @@ namespace CheckDownload
try
{
var ipUrl = signedUrl.Replace(signedUri.Host, ip);
var request = new HttpRequestMessage(HttpMethod.Get, ipUrl) { Version = HttpVersion.Version11 };
request.Headers.Host = signedUri.Host;
using (var response = await _httpClient.SendAsync(request, HttpCompletionOption.ResponseHeadersRead))
@@ -1152,10 +1152,10 @@ namespace CheckDownload
var random = new Random(number);
var guid = new byte[16];
random.NextBytes(guid);
guid[7] = (byte)((guid[7] & 0x0F) | 0x40);
guid[8] = (byte)((guid[8] & 0x3F) | 0x80);
var resultGuid = new Guid(guid);
return resultGuid.ToString("N").Replace("-", "");
}
@@ -1186,19 +1186,19 @@ namespace CheckDownload
try
{
long timestamp = GenerateTimestamp(OneDriveAuthTimeout);
string rand = GenerateUUID(16);
string pathPart = ExtractPathFromUrl(url);
string fullUrl = $"{url}/{file}";
string signString = $"/{pathPart}/{file}-{timestamp}-{rand}-{OneDriveUid}-{OneDriveAuthKey}";
string signature = GenerateMD5(signString);
string authUrl = $"{fullUrl}?auth_key={timestamp}-{rand}-{OneDriveUid}-{signature}";
return authUrl;
}
catch (Exception ex)
@@ -1220,7 +1220,7 @@ namespace CheckDownload
{
var uri = new Uri(url);
pathPart = uri.AbsolutePath.TrimStart('/');
if (string.IsNullOrEmpty(pathPart))
{
string basePattern = $"{uri.Scheme}://{uri.Host}";
@@ -1260,7 +1260,7 @@ namespace CheckDownload
{
return true;
}
UpdateStatus("123盘下载失败尝试阿里云OSS备用方案...");
return await DownloadFileWithFallback(fileName, localPath);
}
@@ -1304,9 +1304,9 @@ namespace CheckDownload
try
{
string currentProgramName = Path.GetFileName(Application.ExecutablePath);
string programPathInMd5 = FindFileInMd5Data(data, currentProgramName);
if (!string.IsNullOrEmpty(programPathInMd5))
{
string programDirInMd5 = Path.GetDirectoryName(programPathInMd5);
@@ -1314,9 +1314,9 @@ namespace CheckDownload
{
programDirInMd5 = "";
}
string currentProgramDir = Application.StartupPath;
if (string.IsNullOrEmpty(programDirInMd5))
{
_baseDirectory = currentProgramDir;
@@ -1350,9 +1350,9 @@ namespace CheckDownload
{
string key = property.Name;
JToken value = property.Value;
string fullPath = string.IsNullOrEmpty(currentPath) ? key : Path.Combine(currentPath, key);
if (value.Type == JTokenType.String)
{
if (string.Equals(key, fileName, StringComparison.OrdinalIgnoreCase))
@@ -1382,11 +1382,11 @@ namespace CheckDownload
{
try
{
string[] expectedDirs = expectedRelativePath.Split(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar },
string[] expectedDirs = expectedRelativePath.Split(new char[] { Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar },
StringSplitOptions.RemoveEmptyEntries);
string checkDir = currentDir;
for (int i = 0; i < expectedDirs.Length; i++)
{
string parentDir = Directory.GetParent(checkDir)?.FullName;
@@ -1394,10 +1394,10 @@ namespace CheckDownload
{
break;
}
string currentDirName = Path.GetFileName(checkDir);
string expectedDirName = expectedDirs[expectedDirs.Length - 1 - i];
if (string.Equals(currentDirName, expectedDirName, StringComparison.OrdinalIgnoreCase))
{
if (i == expectedDirs.Length - 1)
@@ -1411,7 +1411,7 @@ namespace CheckDownload
break;
}
}
return currentDir;
}
catch (Exception)
@@ -1495,8 +1495,14 @@ namespace CheckDownload
await Task.Run(() => {
try
{
string sevenZipDllPath = Extract7zDll();
if (string.IsNullOrEmpty(sevenZipDllPath))
{
throw new Exception("无法提取7z.dll解压中止。");
}
string extractionPath = Path.GetDirectoryName(sevenZipFile);
using (var archiveFile = new ArchiveFile(sevenZipFile))
using (var archiveFile = new ArchiveFile(sevenZipFile, sevenZipDllPath))
{
archiveFile.Extract(extractionPath, true);
}
@@ -1514,8 +1520,49 @@ namespace CheckDownload
catch (Exception ex)
{
UpdateStatus($"处理 tim.7z 时出错: {ex.Message}");
MessageBox.Show($"处理 tim.7z 时出错: {ex.Message}");
await Task.Delay(3000);
}
}
/// <summary>
/// 从嵌入的资源中提取与当前进程体系结构匹配的7z.dll到临时目录。
/// </summary>
/// <returns>提取的7z.dll的路径如果失败则返回null。</returns>
private string Extract7zDll()
{
try
{
string dllName = Environment.Is64BitProcess ? "7z-x64.dll" : "7z-x86.dll";
string resourceName = $"CheckDownload.{dllName}";
string dllPath = Path.Combine(_tempDirectory, "7z.dll");
if (File.Exists(dllPath))
{
// 可以选择在这里添加对现有DLL版本的校验但为简化我们先直接返回
return dllPath;
}
using (var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName))
{
if (resourceStream == null)
{
UpdateStatus($"在嵌入资源中未找到 {dllName}。");
return null;
}
using (var fileStream = new FileStream(dllPath, FileMode.Create, FileAccess.Write))
{
resourceStream.CopyTo(fileStream);
}
}
return dllPath;
}
catch (Exception ex)
{
UpdateStatus($"提取7z.dll失败: {ex.Message}");
return null;
}
}
}
}