WPF中使用FolderBrowserDialog检测选中路径状态与文件夹内文件属性
WPF项目FolderBrowserDialog 功能扩展实现
需求对应实现逻辑
- 空值/null路径校验:先判断对话框返回的操作结果,再通过
string.IsNullOrEmpty校验选中路径的有效性,补充路径存在性校验规避边界异常 - 空文件夹判断:采用懒加载枚举的方式检测目录内容,无需一次性加载全量文件列表,大目录下判断性能更优
- 文件扩展名提取:遍历目标路径下的文件,提取扩展名后自动去重,可按需配置是否递归读取子文件夹内容
改造后完整可运行代码
前置依赖:需在代码顶部引入两个命名空间,否则会触发编译报错
using System.IO;提供路径、文件操作能力using System.Linq;提供集合遍历判断能力
try { using (var dialog = new System.Windows.Forms.FolderBrowserDialog()) { System.Windows.Forms.DialogResult result = dialog.ShowDialog(); // 实现需求1:校验选中路径为null/空、用户取消选择的场景 if (result != System.Windows.Forms.DialogResult.OK || string.IsNullOrEmpty(dialog.SelectedPath)) { FileText.Text = string.Empty; return; } string selectedPath = dialog.SelectedPath; FileText.Text = selectedPath; // 边界防护:校验路径是否真实存在(避免选中后路径被手动删除的异常) if (!Directory.Exists(selectedPath)) { MessageBox.Show("选中的文件夹已不存在"); return; } // 实现需求2:判断是否为空文件夹 bool isEmptyFolder = !Directory.EnumerateFileSystemEntries(selectedPath).Any(); if (isEmptyFolder) { MessageBox.Show("选中的文件夹是空文件夹"); return; } // 实现需求3:获取文件夹内所有文件的扩展名(自动去重、忽略大小写差异) // 如需递归读取所有子文件夹的文件,将SearchOption.TopDirectoryOnly替换为SearchOption.AllDirectories即可 var extensionSet = new HashSet<string>(StringComparer.OrdinalIgnoreCase); foreach (var filePath in Directory.EnumerateFiles(selectedPath, "*.*", SearchOption.TopDirectoryOnly)) { string ext = Path.GetExtension(filePath).ToLowerInvariant(); if (!string.IsNullOrEmpty(ext)) { extensionSet.Add(ext); } } // extensionSet为提取完成的去重扩展名集合,可按需存储、展示 MessageBox.Show($"文件夹内包含的文件类型:{string.Join("、", extensionSet)}"); } } catch (UnauthorizedAccessException) { MessageBox.Show("无权限访问该文件夹,请更换目录重试"); } catch (Exception exp) { Console.WriteLine("Error : " + exp); }
关键实现说明
- 空文件夹判断未使用
Directory.GetFiles()这类一次性全量加载的方法,而是通过EnumerateFileSystemEntries懒加载枚举,检测到第一个文件/子文件夹即可终止判断,大幅降低大目录下的判断耗时 - 扩展名收集阶段使用
HashSet配合忽略大小写的比较器,避免.TXT和.txt被重复统计的问题 - 单独捕获
UnauthorizedAccessException权限异常,给用户更明确的操作提示,避免笼统的异常反馈影响使用体验
内容的提问来源于stack exchange,提问作者user6358496
相关产品推荐
相关产品推荐

