优化暗码读取器

This commit is contained in:
2026-04-29 10:46:50 +08:00
parent e13f9e775d
commit deca0ed4f5
2 changed files with 125 additions and 92 deletions

View File

@@ -21,7 +21,6 @@ namespace Reader
Filename = new DataGridViewTextBoxColumn(); Filename = new DataGridViewTextBoxColumn();
eryi_ID = new DataGridViewTextBoxColumn(); eryi_ID = new DataGridViewTextBoxColumn();
= new DataGridViewTextBoxColumn(); = new DataGridViewTextBoxColumn();
= new DataGridViewTextBoxColumn();
((System.ComponentModel.ISupportInitialize)dgv).BeginInit(); ((System.ComponentModel.ISupportInitialize)dgv).BeginInit();
SuspendLayout(); SuspendLayout();
// //
@@ -58,12 +57,13 @@ namespace Reader
dgv.AllowUserToDeleteRows = false; dgv.AllowUserToDeleteRows = false;
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill;
dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize; dgv.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.AutoSize;
dgv.Columns.AddRange(new DataGridViewColumn[] { Filename, eryi_ID, , }); dgv.Columns.AddRange(new DataGridViewColumn[] { Filename, eryi_ID, });
dgv.Location = new Point(12, 59); dgv.Location = new Point(12, 59);
dgv.Name = "dgv"; dgv.Name = "dgv";
dgv.ReadOnly = true; dgv.ReadOnly = true;
dgv.Size = new Size(748, 332); dgv.Size = new Size(748, 332);
dgv.TabIndex = 2; dgv.TabIndex = 2;
dgv.CellClick += dgv_CellClick;
// //
// Filename // Filename
// //
@@ -92,15 +92,6 @@ namespace Reader
.ReadOnly = true; .ReadOnly = true;
.Width = 105; .Width = 105;
// //
// 暗码写入时间
//
.AutoSizeMode = DataGridViewAutoSizeColumnMode.ColumnHeader;
.FillWeight = 300F;
.HeaderText = "暗码写入时间";
.Name = "暗码写入时间";
.ReadOnly = true;
.Width = 105;
//
// MainForm // MainForm
// //
ClientSize = new Size(791, 419); ClientSize = new Size(791, 419);
@@ -125,6 +116,5 @@ namespace Reader
private DataGridViewTextBoxColumn Filename; private DataGridViewTextBoxColumn Filename;
private DataGridViewTextBoxColumn eryi_ID; private DataGridViewTextBoxColumn eryi_ID;
private DataGridViewTextBoxColumn ; private DataGridViewTextBoxColumn ;
private DataGridViewTextBoxColumn ;
} }
} }

View File

@@ -1,4 +1,6 @@
using System; using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Linq; using System.Linq;
using System.Net.Http; using System.Net.Http;
@@ -14,6 +16,10 @@ namespace Reader
{ {
private static readonly HttpClient http = new HttpClient(); private static readonly HttpClient http = new HttpClient();
private static readonly string ServerUrl; private static readonly string ServerUrl;
private static readonly HashSet<string> DocumentExtensions = new(StringComparer.OrdinalIgnoreCase)
{
".doc", ".docx", ".pdf", ".ppt", ".pptx"
};
static MainForm() static MainForm()
{ {
@@ -47,25 +53,29 @@ namespace Reader
return; return;
} }
dgv.Rows.Clear(); dgv.Rows.Clear();
var files = Directory.GetFiles(folder, "*", SearchOption.AllDirectories); var files = Directory
var shaList = new System.Collections.Generic.List<string>(); .GetFiles(folder, "*", SearchOption.AllDirectories)
var fileMap = new System.Collections.Generic.Dictionary<string, string>(); .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) foreach (var f in files)
{ {
try try
{ {
var sha = await Task.Run(() => ComputeSha256(f)); var sha = await Task.Run(() => ComputeSha256(f));
fileEntries.Add((f, sha));
shaList.Add(sha); shaList.Add(sha);
fileMap[sha] = f;
} }
catch { } catch { }
} }
if (shaList.Count == 0) if (fileEntries.Count == 0)
{ {
MessageBox.Show("没有找到文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); MessageBox.Show("没有找到支持的文档文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
return; return;
} }
var payload = new { shas = shaList }; var payload = new { shas = shaList.Distinct().ToList() };
var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json"); var content = new StringContent(JsonSerializer.Serialize(payload), Encoding.UTF8, "application/json");
var resp = await http.PostAsync(ServerUrl + "/read", content); var resp = await http.PostAsync(ServerUrl + "/read", content);
if (!resp.IsSuccessStatusCode) if (!resp.IsSuccessStatusCode)
@@ -77,21 +87,24 @@ namespace Reader
using var doc = JsonDocument.Parse(text); using var doc = JsonDocument.Parse(text);
var root = doc.RootElement; var root = doc.RootElement;
var data = root.GetProperty("data"); var data = root.GetProperty("data");
foreach (var sha in shaList) foreach (var entry in fileEntries)
{ {
var fileName = Path.GetFileName(fileMap[sha]); var fileName = Path.GetFileName(entry.FilePath);
if (data.TryGetProperty(sha, out var item) && item.ValueKind != JsonValueKind.Null) string up = "无";
string down = "无";
if (data.TryGetProperty(entry.Sha, out var item) && item.ValueKind != JsonValueKind.Null)
{ {
var up = item.GetProperty("upload_code").GetString() ?? ""; up = item.GetProperty("upload_code").GetString() ?? "";
var down = item.GetProperty("download_code").GetString() ?? ""; down = item.GetProperty("download_code").GetString() ?? "";
var created = item.GetProperty("created_at").GetString() ?? "";
dgv.Rows.Add(fileName, up, down, created);
} }
else var rowIndex = dgv.Rows.Add(fileName, up, down);
{ dgv.Rows[rowIndex].Tag = entry.FilePath;
dgv.Rows.Add(fileName, "无", "无", "无");
} }
} }
private static bool IsSupportedDocument(string filePath)
{
return DocumentExtensions.Contains(Path.GetExtension(filePath));
} }
private static string ComputeSha256(string filePath) private static string ComputeSha256(string filePath)
@@ -106,30 +119,60 @@ namespace Reader
private void MainForm_Load(object sender, EventArgs e) private void MainForm_Load(object sender, EventArgs e)
{ {
// 1. 去除自动尺寸模式的限制,改用手动指定
dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None;
dgv.Columns["Filename"].Width = 470;
dgv.Columns["eryi_ID"].Width = 120;
dgv.Columns["下载者用户名"].Width = 130;
}
// 2. 计算每一列的理想宽度 private void dgv_CellClick(object sender, DataGridViewCellEventArgs e)
// 假设您有 N 列,除了最后一列,其余列平分空间
int columnCount = dgv.Columns.Count;
int totalWidth = dgv.ClientSize.Width; // 获取控件当前宽度
// 3. 遍历每一列
for (int i = 0; i < columnCount; i++)
{ {
// 这里做一个简单的平均分配逻辑 HandleGridClick(e);
double width = totalWidth / columnCount;
// 设置列宽,注意:不能小于最小宽度
dgv.Columns[i].Width = (int)Math.Ceiling(width);
} }
// 如果最后一列想稍微宽一点,或者确保宽度总和等于控件宽度,可以做微调 private void HandleGridClick(DataGridViewCellEventArgs e)
int remaining = totalWidth - dgv.Columns.Cast<DataGridViewColumn>() {
.Take(columnCount - 1) if (e.RowIndex < 0 || e.ColumnIndex < 0)
.Sum(col => col.Width); {
return;
}
dgv.Columns[columnCount - 1].Width = remaining; 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);
}
} }
} }
} }