134 lines
5.2 KiB
C#
134 lines
5.2 KiB
C#
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<string>();
|
|
var fileMap = new System.Collections.Generic.Dictionary<string, string>();
|
|
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<DataGridViewColumn>()
|
|
.Take(columnCount - 1)
|
|
.Sum(col => col.Width);
|
|
|
|
dgv.Columns[columnCount - 1].Width = remaining;
|
|
}
|
|
}
|
|
}
|