SlideCombine/Form1.cs

470 lines
18 KiB
C#
Raw Normal View History

2025-11-24 10:59:56 +08:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
2025-11-24 10:59:56 +08:00
using System.Drawing;
using System.Windows.Forms;
namespace SlideCombine
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// 设置窗体图标 - 使用嵌入资源
try
{
var stream = GetType().Assembly.GetManifestResourceStream("SlideCombine.app.ico");
if (stream != null)
{
this.Icon = new Icon(stream);
}
}
catch
{
// 如果图标加载失败,使用默认图标
// this.Icon = SystemIcons.Application;
}
}
private void btnBrowseSource_Click(object sender, EventArgs e)
{
string selectedPath = ShowModernFolderBrowser("请选择包含PDF文件夹的路径含FreePic2Pdf_bkmk.txt文件", txtSourcePath.Text);
if (!string.IsNullOrEmpty(selectedPath))
2025-11-24 10:59:56 +08:00
{
txtSourcePath.Text = selectedPath;
LogInfo($"已选择PDF路径: {selectedPath}");
2025-11-24 10:59:56 +08:00
}
}
private void btnBrowseText_Click(object sender, EventArgs e)
{
string selectedPath = ShowModernFolderBrowser("请选择包含元数据TXT文件的路径", txtTextPath.Text);
if (!string.IsNullOrEmpty(selectedPath))
{
txtTextPath.Text = selectedPath;
LogInfo($"已选择TXT源路径: {selectedPath}");
}
}
2025-11-24 10:59:56 +08:00
private void btnBrowseOutput_Click(object sender, EventArgs e)
{
string selectedPath = ShowModernFolderBrowser("请选择合并后TXT文件的输出路径", txtOutputPath.Text);
if (!string.IsNullOrEmpty(selectedPath))
2025-11-24 10:59:56 +08:00
{
txtOutputPath.Text = selectedPath;
LogInfo($"已选择最终输出路径: {selectedPath}");
2025-11-24 10:59:56 +08:00
}
}
private void btnPasteSource_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
var pastedPath = Clipboard.GetText().Trim();
if (!string.IsNullOrEmpty(pastedPath))
{
txtSourcePath.Text = pastedPath;
LogInfo($"已粘贴PDF路径: {pastedPath}");
}
}
else
{
MessageBox.Show("剪贴板中没有文本内容", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnPasteText_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
var pastedPath = Clipboard.GetText().Trim();
if (!string.IsNullOrEmpty(pastedPath))
{
txtTextPath.Text = pastedPath;
LogInfo($"已粘贴TXT源路径: {pastedPath}");
}
}
else
{
MessageBox.Show("剪贴板中没有文本内容", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
private void btnPasteOutput_Click(object sender, EventArgs e)
{
if (Clipboard.ContainsText())
{
var pastedPath = Clipboard.GetText().Trim();
if (!string.IsNullOrEmpty(pastedPath))
{
txtOutputPath.Text = pastedPath;
LogInfo($"已粘贴输出路径: {pastedPath}");
}
}
else
{
MessageBox.Show("剪贴板中没有文本内容", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
}
2025-11-24 10:59:56 +08:00
private void btnClear_Click(object sender, EventArgs e)
{
txtSourcePath.Clear();
txtTextPath.Clear();
2025-11-24 10:59:56 +08:00
txtOutputPath.Clear();
txtLog.Clear();
progressBar.Value = 0;
LogInfo("界面已清空");
2025-11-24 10:59:56 +08:00
}
private void btnExit_Click(object sender, EventArgs e)
{
LogInfo("程序即将退出");
2025-11-24 10:59:56 +08:00
Application.Exit();
}
private void btnMerge_Click(object sender, EventArgs e)
{
try
{
// 验证输入
if (string.IsNullOrWhiteSpace(txtSourcePath.Text) ||
string.IsNullOrWhiteSpace(txtTextPath.Text) ||
string.IsNullOrWhiteSpace(txtOutputPath.Text))
{
MessageBox.Show("请选择所有三个路径PDF路径、TXT源路径和输出路径", "提示", MessageBoxButtons.OK, MessageBoxIcon.Warning);
return;
}
if (!Directory.Exists(txtSourcePath.Text))
{
MessageBox.Show("指定的PDF文件夹路径不存在", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
if (!Directory.Exists(txtTextPath.Text))
{
MessageBox.Show("指定的TXT源文件路径不存在", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
// 禁用按钮,防止重复点击
btnMerge.Enabled = false;
btnClear.Enabled = false;
// 重置进度条和日志
progressBar.Value = 0;
txtLog.Clear();
Log("开始处理PDF书签文件...");
// 处理文件
var results = FileMerger.ProcessAllFolders(txtSourcePath.Text, txtTextPath.Text, txtOutputPath.Text);
// 显示进度
progressBar.Value = 50;
Log($"找到 {results.Count} 个文件组需要处理");
// 保存结果
FileMerger.SaveResults(results, txtOutputPath.Text);
progressBar.Value = 100;
// 统计成功和失败的数量
int successCount = 0;
int failCount = 0;
var sb = new StringBuilder();
foreach (var result in results)
{
if (result.Success)
{
successCount++;
Log($"✓ 成功处理: {result.BaseFileName} (合并了 {result.SourceFiles.Count} 个文件)");
}
else
{
failCount++;
Log($"✗ 处理失败: {result.ErrorMessage}");
}
}
Log($"处理完成! 成功: {successCount}, 失败: {failCount}");
if (successCount > 0)
{
MessageBox.Show($"书签合并完成!\n成功处理 {successCount} 个文件\n输出路径: {txtOutputPath.Text}",
"处理完成", MessageBoxButtons.OK, MessageBoxIcon.Information);
}
else
{
MessageBox.Show("没有成功处理任何文件,请检查输入路径和文件格式。",
"处理失败", MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
catch (Exception ex)
{
Log($"错误: {ex.Message}");
MessageBox.Show($"处理过程中发生错误:\n{ex.Message}",
"错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
// 重新启用按钮
btnMerge.Enabled = true;
btnClear.Enabled = true;
}
2025-11-24 10:59:56 +08:00
}
private void Log(string msg)
{
string timestamp = DateTime.Now.ToString("HH:mm:ss");
txtLog.AppendText($"[{timestamp}] {msg}\r\n");
txtLog.ScrollToCaret();
Application.DoEvents();
}
private void LogSuccess(string msg)
{
string timestamp = DateTime.Now.ToString("HH:mm:ss");
txtLog.SelectionStart = txtLog.TextLength;
txtLog.SelectionColor = Color.Green;
txtLog.AppendText($"[{timestamp}] ✅ {msg}\r\n");
txtLog.SelectionColor = txtLog.ForeColor;
txtLog.ScrollToCaret();
Application.DoEvents();
}
private void LogError(string msg)
{
string timestamp = DateTime.Now.ToString("HH:mm:ss");
txtLog.SelectionStart = txtLog.TextLength;
txtLog.SelectionColor = Color.Red;
txtLog.AppendText($"[{timestamp}] ❌ {msg}\r\n");
txtLog.SelectionColor = txtLog.ForeColor;
txtLog.ScrollToCaret();
Application.DoEvents();
}
private void LogInfo(string msg)
{
string timestamp = DateTime.Now.ToString("HH:mm:ss");
txtLog.SelectionStart = txtLog.TextLength;
txtLog.SelectionColor = Color.Blue;
txtLog.AppendText($"[{timestamp}] {msg}\r\n");
txtLog.SelectionColor = txtLog.ForeColor;
2025-11-24 10:59:56 +08:00
txtLog.ScrollToCaret();
Application.DoEvents();
}
private string ShowModernFolderBrowser(string title, string initialPath)
{
using (var form = new Form())
{
form.Text = title;
form.Size = new Size(600, 450);
form.StartPosition = FormStartPosition.CenterParent;
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.MaximizeBox = false;
form.MinimizeBox = false;
form.BackColor = Color.White;
// 标题标签
var titleLabel = new Label();
titleLabel.Text = title;
titleLabel.Location = new Point(20, 20);
titleLabel.Size = new Size(540, 30);
titleLabel.Font = new Font("Microsoft YaHei", 11F, FontStyle.Bold);
titleLabel.ForeColor = Color.FromArgb(51, 51, 51);
form.Controls.Add(titleLabel);
// 路径输入框
var pathTextBox = new TextBox();
pathTextBox.Location = new Point(20, 60);
pathTextBox.Size = new Size(460, 30);
pathTextBox.Font = new Font("Microsoft YaHei", 10F);
pathTextBox.Text = initialPath ?? string.Empty;
pathTextBox.BorderStyle = BorderStyle.FixedSingle;
form.Controls.Add(pathTextBox);
// 浏览按钮
var browseButton = new Button();
browseButton.Text = "浏览";
browseButton.Location = new Point(490, 60);
browseButton.Size = new Size(70, 30);
browseButton.Font = new Font("Microsoft YaHei", 9F);
browseButton.BackColor = Color.FromArgb(66, 139, 202);
browseButton.ForeColor = Color.White;
browseButton.FlatStyle = FlatStyle.Flat;
browseButton.FlatAppearance.BorderSize = 0;
form.Controls.Add(browseButton);
// 文件列表
var fileList = new ListView();
fileList.Location = new Point(20, 100);
fileList.Size = new Size(540, 250);
fileList.View = View.Details;
fileList.FullRowSelect = true;
fileList.GridLines = true;
fileList.Font = new Font("Microsoft YaHei", 9F);
fileList.BorderStyle = BorderStyle.FixedSingle;
fileList.Columns.Add("名称", 300);
fileList.Columns.Add("修改日期", 140);
fileList.Columns.Add("类型", 80);
form.Controls.Add(fileList);
// 状态标签
var statusLabel = new Label();
statusLabel.Text = "当前路径: ";
statusLabel.Location = new Point(20, 360);
statusLabel.Size = new Size(540, 20);
statusLabel.Font = new Font("Microsoft YaHei", 9F);
statusLabel.ForeColor = Color.FromArgb(102, 102, 102);
form.Controls.Add(statusLabel);
// 确定按钮
var okButton = new Button();
okButton.Text = "确定";
okButton.Location = new Point(380, 380);
okButton.Size = new Size(80, 35);
okButton.Font = new Font("Microsoft YaHei", 10F, FontStyle.Bold);
okButton.BackColor = Color.FromArgb(92, 184, 92);
okButton.ForeColor = Color.White;
okButton.FlatStyle = FlatStyle.Flat;
okButton.FlatAppearance.BorderSize = 0;
form.AcceptButton = okButton;
form.Controls.Add(okButton);
// 取消按钮
var cancelButton = new Button();
cancelButton.Text = "取消";
cancelButton.Location = new Point(480, 380);
cancelButton.Size = new Size(80, 35);
cancelButton.Font = new Font("Microsoft YaHei", 10F);
cancelButton.BackColor = Color.FromArgb(217, 83, 79);
cancelButton.ForeColor = Color.White;
cancelButton.FlatStyle = FlatStyle.Flat;
cancelButton.FlatAppearance.BorderSize = 0;
cancelButton.CancelButton = cancelButton;
form.Controls.Add(cancelButton);
// 当前路径
string currentPath = string.IsNullOrEmpty(initialPath) ?
Environment.GetFolderPath(Environment.SpecialFolder.Desktop) : initialPath;
// 加载文件夹内容的方法
void LoadFolderContent(string path)
{
try
{
fileList.Items.Clear();
statusLabel.Text = $"当前路径: {path}";
if (!string.IsNullOrEmpty(path) && Directory.Exists(path))
{
// 添加返回上级目录
if (Path.GetDirectoryName(path) != null)
{
var parentItem = new ListViewItem(new[] { "..", "上级目录", "文件夹" });
parentItem.Tag = Path.GetDirectoryName(path);
parentItem.ForeColor = Color.FromArgb(66, 139, 202);
fileList.Items.Add(parentItem);
}
// 添加子文件夹
foreach (var dir in Directory.GetDirectories(path))
{
var dirInfo = new DirectoryInfo(dir);
var item = new ListViewItem(new[]
{
dirInfo.Name,
dirInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm"),
"文件夹"
});
item.Tag = dirInfo.FullName;
item.ForeColor = Color.FromArgb(51, 51, 51);
fileList.Items.Add(item);
}
}
}
catch (Exception ex)
{
MessageBox.Show($"无法访问该路径: {ex.Message}", "错误",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
}
// 浏览按钮点击事件
browseButton.Click += (s, e) =>
{
using (var dialog = new FolderBrowserDialog())
{
dialog.Description = title;
if (!string.IsNullOrEmpty(currentPath))
{
dialog.SelectedPath = currentPath;
}
if (dialog.ShowDialog() == DialogResult.OK)
{
currentPath = dialog.SelectedPath;
pathTextBox.Text = currentPath;
LoadFolderContent(currentPath);
}
}
};
// 文件列表双击事件
fileList.DoubleClick += (s, e) =>
{
if (fileList.SelectedItems.Count > 0)
{
var selectedItem = fileList.SelectedItems[0];
if (selectedItem.Tag is string selectedPath && Directory.Exists(selectedPath))
{
currentPath = selectedPath;
pathTextBox.Text = currentPath;
LoadFolderContent(currentPath);
}
}
};
// 确定按钮点击事件
okButton.Click += (s, e) =>
{
if (Directory.Exists(pathTextBox.Text))
{
form.DialogResult = DialogResult.OK;
form.Close();
}
else
{
MessageBox.Show("请输入有效的文件夹路径", "提示",
MessageBoxButtons.OK, MessageBoxIcon.Warning);
}
};
// 取消按钮点击事件
cancelButton.Click += (s, e) =>
{
form.DialogResult = DialogResult.Cancel;
form.Close();
};
// 初始加载
LoadFolderContent(currentPath);
// 显示对话框
if (form.ShowDialog() == DialogResult.OK)
{
return pathTextBox.Text;
}
}
return null;
}
2025-11-24 10:59:56 +08:00
}
}