using System; 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; static MainForm() { var configPath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "appsettings.json"); var jsonContent = System.IO.File.ReadAllText(configPath); ServerUrl = jsonContent.Replace("\"", "").Split(':')[1].Replace("/", "").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); var shaList = new System.Collections.Generic.List(); var fileMap = new System.Collections.Generic.Dictionary(); foreach (var f in files) { try { var sha = await Task.Run(() => ComputeSha256(f)); shaList.Add(sha); fileMap[sha] = f; } catch { } } if (shaList.Count == 0) { MessageBox.Show("没有找到文件。", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } var payload = new { shas = shaList }; 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 sha in shaList) { var fileName = Path.GetFileName(fileMap[sha]); if (data.TryGetProperty(sha, out var item) && item.ValueKind != JsonValueKind.Null) { var up = item.GetProperty("upload_code").GetString() ?? ""; var down = item.GetProperty("download_code").GetString() ?? ""; var created = item.GetProperty("created_at").GetString() ?? ""; dgv.Rows.Add(fileName, up, down, created); } else { dgv.Rows.Add(fileName, "无", "无", "无"); } } } 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) { // 1. 去除自动尺寸模式的限制,改用手动指定 dgv.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None; // 2. 计算每一列的理想宽度 // 假设您有 N 列,除了最后一列,其余列平分空间 int columnCount = dgv.Columns.Count; int totalWidth = dgv.ClientSize.Width; // 获取控件当前宽度 // 3. 遍历每一列 for (int i = 0; i < columnCount; i++) { // 这里做一个简单的平均分配逻辑 double width = totalWidth / columnCount; // 设置列宽,注意:不能小于最小宽度 dgv.Columns[i].Width = (int)Math.Ceiling(width); } // 如果最后一列想稍微宽一点,或者确保宽度总和等于控件宽度,可以做微调 int remaining = totalWidth - dgv.Columns.Cast() .Take(columnCount - 1) .Sum(col => col.Width); dgv.Columns[columnCount - 1].Width = remaining; } } }