x86和x64
This commit is contained in:
BIN
7z-x64.dll
Normal file
BIN
7z-x64.dll
Normal file
Binary file not shown.
BIN
7z-x86.dll
Normal file
BIN
7z-x86.dll
Normal file
Binary file not shown.
@@ -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
175
Form1.cs
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user