179 lines
6.4 KiB
C#
179 lines
6.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.IO;
|
|
using System.Linq;
|
|
using System.Net.Http;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Text.Json;
|
|
using System.Threading.Tasks;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Reader
|
|
{
|
|
public partial class MainForm : Form
|
|
{
|
|
private static readonly HttpClient http = new HttpClient();
|
|
private static readonly string ServerUrl;
|
|
private static readonly HashSet<string> DocumentExtensions = new(StringComparer.OrdinalIgnoreCase)
|
|
{
|
|
".doc", ".docx", ".pdf", ".ppt", ".pptx"
|
|
};
|
|
|
|
static MainForm()
|
|
{
|
|
var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json");
|
|
var jsonContent = System.IO.File.ReadAllText(configPath);
|
|
var start = jsonContent.IndexOf('"', jsonContent.IndexOf("ServerUrl") + 10);
|
|
var end = jsonContent.IndexOf('"', start + 1);
|
|
ServerUrl = jsonContent.Substring(start + 1, end - start - 1).Trim();
|
|
}
|
|
|
|
public MainForm()
|
|
{
|
|
InitializeComponent();
|
|
}
|
|
|
|
private void btnBrowse_Click(object sender, EventArgs e)
|
|
{
|
|
using var fbd = new FolderBrowserDialog();
|
|
if (fbd.ShowDialog() == DialogResult.OK)
|
|
{
|
|
txtFolder.Text = fbd.SelectedPath;
|
|
}
|
|
}
|
|
|
|
private async void btnRead_Click(object sender, EventArgs e)
|
|
{
|
|
var folder = txtFolder.Text;
|
|
if (string.IsNullOrWhiteSpace(folder) || !Directory.Exists(folder))
|
|
{
|
|
MessageBox.Show("请选择有效的文件夹。", "错误", MessageBoxButtons.OK, MessageBoxIcon.Warning);
|
|
return;
|
|
}
|
|
dgv.Rows.Clear();
|
|
var files = Directory
|
|
.GetFiles(folder, "*", SearchOption.AllDirectories)
|
|
.Where(IsSupportedDocument)
|
|
.OrderBy(Path.GetFileName, StringComparer.CurrentCultureIgnoreCase)
|
|
.ToList();
|
|
var fileEntries = new List<(string FilePath, string Sha)>();
|
|
var shaList = new List<string>();
|
|
foreach (var f in files)
|
|
{
|
|
try
|
|
{
|
|
var sha = await Task.Run(() => ComputeSha256(f));
|
|
fileEntries.Add((f, sha));
|
|
shaList.Add(sha);
|
|
}
|
|
catch { }
|
|
}
|
|
if (fileEntries.Count == 0)
|
|
{
|
|
MessageBox.Show("没有找到支持的文档文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
|
|
return;
|
|
}
|
|
var payload = new { shas = shaList.Distinct().ToList() };
|
|
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
|
|
var resp = await http.PostAsync(ServerUrl + "/read", content);
|
|
if (!resp.IsSuccessStatusCode)
|
|
{
|
|
MessageBox.Show("读取失败: " + await resp.Content.ReadAsStringAsync(), "失败", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
return;
|
|
}
|
|
var text = await resp.Content.ReadAsStringAsync();
|
|
using var doc = JsonDocument.Parse(text);
|
|
var root = doc.RootElement;
|
|
var data = root.GetProperty("data");
|
|
foreach (var entry in fileEntries)
|
|
{
|
|
var fileName = Path.GetFileName(entry.FilePath);
|
|
string up = "无";
|
|
string down = "无";
|
|
if (data.TryGetProperty(entry.Sha, out var item) && item.ValueKind != JsonValueKind.Null)
|
|
{
|
|
up = item.GetProperty("upload_code").GetString() ?? "";
|
|
down = item.GetProperty("download_code").GetString() ?? "";
|
|
}
|
|
var rowIndex = dgv.Rows.Add(fileName, up, down);
|
|
dgv.Rows[rowIndex].Tag = entry.FilePath;
|
|
}
|
|
}
|
|
|
|
private static bool IsSupportedDocument(string filePath)
|
|
{
|
|
return DocumentExtensions.Contains(Path.GetExtension(filePath));
|
|
}
|
|
|
|
private static string ComputeSha256(string filePath)
|
|
{
|
|
using var sha = SHA256.Create();
|
|
using var stream = File.OpenRead(filePath);
|
|
var hash = sha.ComputeHash(stream);
|
|
var sb = new StringBuilder();
|
|
foreach (var b in hash) sb.Append(b.ToString("x2"));
|
|
return sb.ToString();
|
|
}
|
|
|
|
private void MainForm_Load(object sender, EventArgs e)
|
|
{
|
|
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
|
|
dgv.Columns["Filename"].Width = 470;
|
|
dgv.Columns["eryi_ID"].Width = 120;
|
|
dgv.Columns["下载者用户名"].Width = 130;
|
|
}
|
|
|
|
private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
|
|
{
|
|
HandleGridClick(e);
|
|
}
|
|
|
|
private void HandleGridClick(DataGridViewCellEventArgs e)
|
|
{
|
|
if (e.RowIndex < 0 || e.ColumnIndex < 0)
|
|
{
|
|
return;
|
|
}
|
|
|
|
var row = dgv.Rows[e.RowIndex];
|
|
var columnName = dgv.Columns[e.ColumnIndex].Name;
|
|
if (columnName == "Filename")
|
|
{
|
|
var filePath = row.Tag as string;
|
|
if (!string.IsNullOrWhiteSpace(filePath) && File.Exists(filePath))
|
|
{
|
|
OpenWithShell(filePath);
|
|
}
|
|
return;
|
|
}
|
|
|
|
if (columnName == "eryi_ID")
|
|
{
|
|
var code = row.Cells["eryi_ID"].Value?.ToString()?.Trim() ?? "";
|
|
if (!string.IsNullOrWhiteSpace(code) && code != "无")
|
|
{
|
|
OpenWithShell($"https://www.21cnjy.com/H/3/309824/{code}.shtml");
|
|
}
|
|
}
|
|
}
|
|
|
|
private static void OpenWithShell(string target)
|
|
{
|
|
try
|
|
{
|
|
Process.Start(new ProcessStartInfo
|
|
{
|
|
FileName = target,
|
|
UseShellExecute = true
|
|
});
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
MessageBox.Show("打开失败: " + ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
|
|
}
|
|
}
|
|
}
|
|
}
|