You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

190 lines
6.9 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using HtmlAgilityPack;
using System.Linq;
using System.Diagnostics;
class Update
{
public void Update1()
{
string iisServerBaseUrl = "http://192.168.202.23:8080/"; // IIS服务器基本URL
string iisFolder = ""; // IIS服务器上的文件夹路径
string localFolderBase = @"D:\"; // 本地文件夹的基本路径
string localFolder = FindLocalFolder(localFolderBase);
SynchronizeFiles(iisServerBaseUrl, iisFolder, localFolder);
// 继续运行应用程序的主要逻辑
Console.WriteLine("应用程序启动...");
// 在这里添加你的应用程序的主要逻辑
Console.ReadLine();
}
public string FindLocalFolder(string localFolderBase)
{
for (int i = 1; i <= 8; i++)
{
string localFolder = Path.Combine(localFolderBase, $"C{i}");
if (Directory.Exists(localFolder))
{
return localFolder;
}
}
return null;
}
public void SynchronizeFiles(string serverBaseUrl, string serverFolder, string localFolder)
{
using (HttpClient client = new HttpClient())
{
try
{
HttpResponseMessage response = client.GetAsync(new Uri(serverBaseUrl + serverFolder)).Result;
response.EnsureSuccessStatusCode();
string responseContent = response.Content.ReadAsStringAsync().Result;
// 使用HtmlAgilityPack解析HTML内容
HtmlDocument doc = new HtmlDocument();
doc.LoadHtml(responseContent);
// 查找所有包含文件名和文件夹名的<a>标签
var links = doc.DocumentNode.SelectNodes("//a");
if (links != null)
{
foreach (var link in links)
{
string itemName = link.InnerText;
string itemUrl = serverBaseUrl + serverFolder + itemName;
string localPath = Path.Combine(localFolder, itemName);
if (link.InnerText.StartsWith("<dir>"))
{
// 这是一个文件夹
if (!Directory.Exists(localPath))
{
Directory.CreateDirectory(localPath);
}
// 递归处理文件夹中的内容
SynchronizeFiles(serverBaseUrl, serverFolder + itemName + "/", localPath);
}
else
{
// 这是一个文件
if (!string.Equals(itemName, "web.config", StringComparison.OrdinalIgnoreCase))
{
// 检查文件类型是否需要更新
string fileExtension = Path.GetExtension(itemName).ToLower();
if (ShouldUpdateFile(fileExtension))
{
if (File.Exists(localPath))
{
bool filesAreEqual = AreFilesEqual(itemUrl, localPath);
if (!filesAreEqual)
{
DownloadFile(itemUrl, localPath);
Console.WriteLine($"已下载并覆盖文件: {itemName}");
}
else
{
Console.WriteLine($"该文件为最新版本: {itemName}!!!");
}
}
else
{
DownloadFile(itemUrl, localPath);
Console.WriteLine($"已下载文件: {itemName}");
}
}
else
{
Console.WriteLine($"不需要更新的文件类型: {fileExtension}");
}
}
}
}
// 在配置文件更新后,执行以下代码重启程序
Process.Start("Up.bat");
}
else
{
Console.WriteLine("未找到文件列表");
}
}
catch (HttpRequestException ex)
{
Console.WriteLine($"HTTP请求失败: {ex.Message}");
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
public bool ShouldUpdateFile(string fileExtension)
{
// 添加需要更新的文件类型
string[] allowedExtensions = { ".exe", ".dll", ".json", ".xml" };
// 如果文件类型在允许更新的文件类型列表中,则返回 true否则返回 false
return allowedExtensions.Contains(fileExtension);
}
public void DownloadFile(string fileUrl, string localFilePath)
{
using (HttpClient client = new HttpClient())
{
try
{
HttpResponseMessage response = client.GetAsync(new Uri(fileUrl)).Result;
response.EnsureSuccessStatusCode();
using (Stream contentStream = response.Content.ReadAsStreamAsync().Result)
{
using (Stream fileStream = File.Create(localFilePath))
{
contentStream.CopyTo(fileStream);
}
}
Console.WriteLine($"已成功下载文件: {localFilePath}");
}
catch (HttpRequestException ex)
{
// 处理连接断开或其他HTTP请求错误
Console.WriteLine($"HTTP请求失败: {ex.Message}");
// 在这里可以添加重试逻辑或其他处理方式
}
catch (Exception ex)
{
Console.WriteLine($"发生错误: {ex.Message}");
}
}
}
public bool AreFilesEqual(string file1Url, string file2Path)
{
byte[] file1Content = File.ReadAllBytes(file2Path);
using (HttpClient client = new HttpClient())
{
byte[] file2Content = client.GetByteArrayAsync(file1Url).Result;
return StructuralComparisons.StructuralEqualityComparer.Equals(file1Content, file2Content);
}
}
}