diff --git a/Form1.cs b/Form1.cs index 104776b..fd2d7bc 100644 --- a/Form1.cs +++ b/Form1.cs @@ -264,70 +264,99 @@ namespace SlideCombine using (var form = new Form()) { form.Text = title; - form.Size = new Size(600, 450); + form.Size = new Size(800, 600); 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 toolbarPanel = new Panel(); + toolbarPanel.Location = new Point(0, 0); + toolbarPanel.Size = new Size(800, 60); + toolbarPanel.BackColor = Color.FromArgb(248, 248, 248); + toolbarPanel.BorderStyle = BorderStyle.FixedSingle; + form.Controls.Add(toolbarPanel); - // 路径输入框 + // 路径标签 + var pathLabel = new Label(); + pathLabel.Text = "路径:"; + pathLabel.Location = new Point(15, 20); + pathLabel.Size = new Size(40, 20); + pathLabel.Font = new Font("Microsoft YaHei", 9F); + pathLabel.ForeColor = Color.FromArgb(51, 51, 51); + toolbarPanel.Controls.Add(pathLabel); + + // 路径文本框 var pathTextBox = new TextBox(); - pathTextBox.Location = new Point(20, 60); - pathTextBox.Size = new Size(460, 30); + pathTextBox.Location = new Point(60, 18); + pathTextBox.Size = new Size(650, 24); pathTextBox.Font = new Font("Microsoft YaHei", 10F); pathTextBox.Text = initialPath ?? string.Empty; pathTextBox.BorderStyle = BorderStyle.FixedSingle; - form.Controls.Add(pathTextBox); + toolbarPanel.Controls.Add(pathTextBox); - // 浏览按钮 + // 路径浏览按钮 var browseButton = new Button(); - browseButton.Text = "浏览"; - browseButton.Location = new Point(490, 60); - browseButton.Size = new Size(70, 30); + browseButton.Text = "..."; + browseButton.Location = new Point(720, 17); + browseButton.Size = new Size(30, 24); 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); + toolbarPanel.Controls.Add(browseButton); - // 文件列表 + // 左侧文件夹树 + var folderTree = new TreeView(); + folderTree.Location = new Point(15, 70); + folderTree.Size = new Size(250, 450); + folderTree.Font = new Font("Microsoft YaHei", 9F); + folderTree.BorderStyle = BorderStyle.FixedSingle; + folderTree.ShowLines = true; + folderTree.ShowPlusMinus = true; + folderTree.ShowRootLines = true; + folderTree.FullRowSelect = true; + folderTree.Scrollable = true; + form.Controls.Add(folderTree); + + // 右侧文件列表 var fileList = new ListView(); - fileList.Location = new Point(20, 100); - fileList.Size = new Size(540, 250); + fileList.Location = new Point(275, 70); + fileList.Size = new Size(510, 450); 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("名称", 200); + fileList.Columns.Add("修改日期", 150); fileList.Columns.Add("类型", 80); + fileList.Columns.Add("大小", 80); form.Controls.Add(fileList); - // 状态标签 + // 底部状态栏 + var statusPanel = new Panel(); + statusPanel.Location = new Point(0, 530); + statusPanel.Size = new Size(800, 30); + statusPanel.BackColor = Color.FromArgb(240, 240, 240); + statusPanel.BorderStyle = BorderStyle.FixedSingle; + form.Controls.Add(statusPanel); + var statusLabel = new Label(); - statusLabel.Text = "当前路径: "; - statusLabel.Location = new Point(20, 360); - statusLabel.Size = new Size(540, 20); + statusLabel.Text = "就绪"; + statusLabel.Location = new Point(10, 5); + statusLabel.Size = new Size(780, 20); statusLabel.Font = new Font("Microsoft YaHei", 9F); statusLabel.ForeColor = Color.FromArgb(102, 102, 102); - form.Controls.Add(statusLabel); + statusPanel.Controls.Add(statusLabel); - // 确定按钮 + // 底部按钮 var okButton = new Button(); okButton.Text = "确定"; - okButton.Location = new Point(380, 380); + okButton.Location = new Point(620, 20); okButton.Size = new Size(80, 35); okButton.Font = new Font("Microsoft YaHei", 10F, FontStyle.Bold); okButton.BackColor = Color.FromArgb(92, 184, 92); @@ -337,10 +366,9 @@ namespace SlideCombine form.AcceptButton = okButton; form.Controls.Add(okButton); - // 取消按钮 var cancelButton = new Button(); cancelButton.Text = "取消"; - cancelButton.Location = new Point(480, 380); + cancelButton.Location = new Point(710, 20); cancelButton.Size = new Size(80, 35); cancelButton.Font = new Font("Microsoft YaHei", 10F); cancelButton.BackColor = Color.FromArgb(217, 83, 79); @@ -354,26 +382,102 @@ namespace SlideCombine string currentPath = string.IsNullOrEmpty(initialPath) ? Environment.GetFolderPath(Environment.SpecialFolder.Desktop) : initialPath; - // 加载文件夹内容的方法 - void LoadFolderContent(string path) + // 加载文件夹树 + void LoadFolderTree() { + folderTree.Nodes.Clear(); + folderTree.BeginUpdate(); + try { - fileList.Items.Clear(); - statusLabel.Text = $"当前路径: {path}"; + // 获取所有逻辑驱动器 + foreach (var drive in DriveInfo.GetDrives()) + { + var driveNode = new TreeNode(); + driveNode.Text = $"{drive.Name} ({drive.VolumeTitle})"; + driveNode.Tag = drive.Name; - if (!string.IsNullOrEmpty(path) && Directory.Exists(path)) + if (drive.IsReady) + { + driveNode.Nodes.Add(new TreeNode()); // 占位节点 + } + + driveNode.ImageIndex = 0; + driveNode.SelectedImageIndex = 0; + folderTree.Nodes.Add(driveNode); + } + } + catch (Exception ex) + { + statusLabel.Text = $"加载驱动器时出错: {ex.Message}"; + } + + folderTree.EndUpdate(); + } + + // 展开节点时加载子文件夹 + void LoadSubFolders(TreeNode parentNode) + { + if (parentNode.Nodes.Count == 1 && parentNode.Nodes[0].Text == "") + { + parentNode.Nodes.Clear(); + + try + { + var path = parentNode.Tag as string; + if (Directory.Exists(path)) + { + foreach (var dir in Directory.GetDirectories(path)) + { + var dirInfo = new DirectoryInfo(dir); + var node = new TreeNode(dirInfo.Name); + node.Tag = dirInfo.FullName; + + try + { + // 检查是否有子文件夹 + if (Directory.GetDirectories(dir).Length > 0) + { + node.Nodes.Add(new TreeNode()); // 占位节点 + } + } + catch + { + // 无权限访问子文件夹 + } + + parentNode.Nodes.Add(node); + } + } + } + catch (Exception ex) + { + statusLabel.Text = $"加载子文件夹时出错: {ex.Message}"; + } + } + } + + // 加载文件列表 + void LoadFileList(string path) + { + fileList.Items.Clear(); + fileList.BeginUpdate(); + + try + { + if (Directory.Exists(path)) { // 添加返回上级目录 - if (Path.GetDirectoryName(path) != null) + var parentPath = Path.GetDirectoryName(path); + if (!string.IsNullOrEmpty(parentPath)) { - var parentItem = new ListViewItem(new[] { "..", "上级目录", "文件夹" }); - parentItem.Tag = Path.GetDirectoryName(path); + var parentItem = new ListViewItem(new[] { "..", "", "文件夹", "" }); + parentItem.Tag = parentPath; parentItem.ForeColor = Color.FromArgb(66, 139, 202); fileList.Items.Add(parentItem); } - // 添加子文件夹 + // 添加文件夹 foreach (var dir in Directory.GetDirectories(path)) { var dirInfo = new DirectoryInfo(dir); @@ -381,42 +485,83 @@ namespace SlideCombine { 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); } + + // 添加文件 + foreach (var file in Directory.GetFiles(path)) + { + var fileInfo = new FileInfo(file); + var item = new ListViewItem(new[] + { + fileInfo.Name, + fileInfo.LastWriteTime.ToString("yyyy-MM-dd HH:mm"), + GetFileType(fileInfo.Extension), + FormatFileSize(fileInfo.Length) + }); + item.Tag = fileInfo.FullName; + item.ForeColor = Color.FromArgb(102, 102, 102); + fileList.Items.Add(item); + } + + statusLabel.Text = $"{Directory.GetDirectories(path).Length} 个文件夹, {Directory.GetFiles(path).Length} 个文件"; } } catch (Exception ex) { - MessageBox.Show($"无法访问该路径: {ex.Message}", "错误", - MessageBoxButtons.OK, MessageBoxIcon.Warning); + statusLabel.Text = $"加载文件列表时出错: {ex.Message}"; + } + + fileList.EndUpdate(); + } + + string GetFileType(string extension) + { + extension = extension.ToLower(); + switch (extension) + { + case ".txt": return "文本文件"; + case ".pdf": return "PDF文档"; + case ".doc": case ".docx": return "Word文档"; + case ".xls": case ".xlsx": return "Excel表格"; + default: return $"{extension}文件"; } } - // 浏览按钮点击事件 - browseButton.Click += (s, e) => + string FormatFileSize(long bytes) { - using (var dialog = new FolderBrowserDialog()) + string[] sizes = { "B", "KB", "MB", "GB" }; + double len = bytes; + int order = 0; + while (len >= 1024 && order < sizes.Length - 1) { - dialog.Description = title; - if (!string.IsNullOrEmpty(currentPath)) - { - dialog.SelectedPath = currentPath; - } + order++; + len = len / 1024; + } + return $"{len:0.##} {sizes[order]}"; + } - if (dialog.ShowDialog() == DialogResult.OK) - { - currentPath = dialog.SelectedPath; - pathTextBox.Text = currentPath; - LoadFolderContent(currentPath); - } + // 事件处理 + folderTree.BeforeExpand += (s, e) => + { + LoadSubFolders(e.Node); + }; + + folderTree.AfterSelect += (s, e) => + { + if (e.Node.Tag is string path && Directory.Exists(path)) + { + currentPath = path; + pathTextBox.Text = currentPath; + LoadFileList(currentPath); } }; - // 文件列表双击事件 fileList.DoubleClick += (s, e) => { if (fileList.SelectedItems.Count > 0) @@ -426,12 +571,65 @@ namespace SlideCombine { currentPath = selectedPath; pathTextBox.Text = currentPath; - LoadFolderContent(currentPath); + LoadFileList(currentPath); + + // 更新树选择 + var nodes = folderTree.Nodes.Find(GetNodeText(selectedPath), true); + if (nodes.Length > 0) + { + folderTree.SelectedNode = nodes[0]; + } } } }; - // 确定按钮点击事件 + browseButton.Click += (s, e) => + { + using (var dialog = new FolderBrowserDialog()) + { + dialog.Description = title; + dialog.SelectedPath = currentPath; + + if (dialog.ShowDialog() == DialogResult.OK) + { + currentPath = dialog.SelectedPath; + pathTextBox.Text = currentPath; + LoadFileList(currentPath); + + // 更新树选择 + var nodes = folderTree.Nodes.Find(GetNodeText(currentPath), true); + if (nodes.Length > 0) + { + folderTree.SelectedNode = nodes[0]; + } + } + } + }; + + pathTextBox.KeyDown += (s, e) => + { + if (e.KeyCode == Keys.Enter) + { + if (Directory.Exists(pathTextBox.Text)) + { + currentPath = pathTextBox.Text; + LoadFileList(currentPath); + + // 更新树选择 + var nodes = folderTree.Nodes.Find(GetNodeText(currentPath), true); + if (nodes.Length > 0) + { + folderTree.SelectedNode = nodes[0]; + } + } + } + }; + + string GetNodeText(string fullPath) + { + return new DirectoryInfo(fullPath).Name; + } + okButton.Click += (s, e) => { if (Directory.Exists(pathTextBox.Text)) @@ -446,15 +644,15 @@ namespace SlideCombine } }; - // 取消按钮点击事件 cancelButton.Click += (s, e) => { form.DialogResult = DialogResult.Cancel; form.Close(); }; - // 初始加载 - LoadFolderContent(currentPath); + // 初始化 + LoadFolderTree(); + LoadFileList(currentPath); // 显示对话框 if (form.ShowDialog() == DialogResult.OK)