SlideCombine/Form1.cs
yuuko 91d45f9074 使用OpenFileDialog替代FolderBrowserDialog
1. 实现ShowOpenFileDialogForFolder方法:
   - 使用OpenFileDialog提供更现代的界面
   - 配置适合文件夹选择的参数
   - 通过文件选择来获取目录路径

2. 配置OpenFileDialog:
   - 设置CheckFileExists=false允许选择不存在的文件名
   - CheckPathExists=true确保路径存在
   - ValidateNames=false允许非标准文件名
   - 初始文件名设为选择文件夹提示用户

3. 路径处理逻辑:
   - 如果用户选择文件,返回文件所在目录
   - 处理边界情况和异常情况
   - 保持与原有功能的兼容性

4. 用户体验改进:
   - 更现代的对话框界面
   - 更好的文件导航体验
   - 支持地址栏直接输入

现在使用更现代的OpenFileDialog界面,用户体验更好!

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-24 16:35:39 +08:00

255 lines
9.0 KiB
C#
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
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 = ShowOpenFileDialogForFolder("请选择包含PDF文件夹的路径", txtSourcePath.Text);
if (!string.IsNullOrEmpty(selectedPath))
{
txtSourcePath.Text = selectedPath;
LogInfo($"已选择PDF路径: {selectedPath}");
}
}
private void btnBrowseText_Click(object sender, EventArgs e)
{
string selectedPath = ShowOpenFileDialogForFolder("请选择包含元数据TXT文件的路径", txtTextPath.Text);
if (!string.IsNullOrEmpty(selectedPath))
{
txtTextPath.Text = selectedPath;
LogInfo($"已选择TXT源路径: {selectedPath}");
}
}
private void btnBrowseOutput_Click(object sender, EventArgs e)
{
string selectedPath = ShowOpenFileDialogForFolder("请选择合并后TXT文件的输出路径", txtOutputPath.Text);
if (!string.IsNullOrEmpty(selectedPath))
{
txtOutputPath.Text = selectedPath;
LogInfo($"已选择最终输出路径: {selectedPath}");
}
}
private string ShowOpenFileDialogForFolder(string title, string initialPath)
{
using (OpenFileDialog dialog = new OpenFileDialog())
{
dialog.Title = title;
dialog.Filter = "文件夹|*.|所有文件|*.*";
dialog.FileName = "选择文件夹";
dialog.CheckFileExists = false;
dialog.CheckPathExists = true;
dialog.Multiselect = false;
dialog.ValidateNames = false;
// 设置初始目录
if (!string.IsNullOrEmpty(initialPath) && Directory.Exists(initialPath))
{
dialog.InitialDirectory = initialPath;
}
else
{
dialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyComputer);
}
if (dialog.ShowDialog() == DialogResult.OK)
{
string selectedPath = Path.GetDirectoryName(dialog.FileName);
// 如果用户选择了文件,返回文件所在目录
if (!string.IsNullOrEmpty(selectedPath))
{
return selectedPath;
}
// 如果用户只选择了目录(这可能在某些情况下发生)
if (Directory.Exists(dialog.FileName))
{
return dialog.FileName;
}
}
}
return null;
}
private void btnClear_Click(object sender, EventArgs e)
{
txtSourcePath.Clear();
txtTextPath.Clear();
txtOutputPath.Clear();
txtLog.Clear();
progressBar.Value = 0;
LogInfo("界面已清空");
}
private void btnExit_Click(object sender, EventArgs e)
{
LogInfo("程序即将退出");
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;
}
}
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;
txtLog.ScrollToCaret();
Application.DoEvents();
}
}
}