C# WinForm使用if else实现指定目录Word文件按ComboBox选项重命名咨询
问题解答
1. 关于if else逻辑的放置位置
你完全可以把if else判断ComboBox选中项的逻辑写在RenameFiles_Click点击事件内,当前只有2种重命名规则,逻辑简单,直接写在事件里可读性和维护性都足够。如果后续规则扩展到3种以上,再把重命名规则抽为独立方法也完全可以。
2. 现有代码问题修正
你当前的代码存在两处逻辑偏差:
d.GetFiles($"{ExtensionCombo.Text}")的参数错误:ExtensionCombo存的是重命名规则,不是文件筛选后缀,要匹配目录下所有Word文档,应该固定传"*.docx"- 原有复制逻辑没有实现按规则提取学号拼接新文件名的需求,需要补充拆分源文件名提取
StudentCode的逻辑
3. 修正后参考代码
注:如果是Winform项目,事件参数默认是EventArgs e,和示例里的RoutedEventArgs e(WPF参数)不冲突,核心逻辑直接复用即可
private void RenameFiles_Click(object sender, RoutedEventArgs e) { // 先判断用户是否选中了重命名规则 if(ExtensionCombo.SelectedItem == null) { MessageBox.Show("请先选择重命名规则"); return; } string targetDir = PathStamp.Text; // 校验目录是否存在 if(!Directory.Exists(targetDir)) { MessageBox.Show("所选目录不存在"); return; } // 获取目录下所有docx文件 DirectoryInfo d = new DirectoryInfo(targetDir); FileInfo[] wordFiles = d.GetFiles("*.docx"); // 获取选中的重命名规则后缀 string ruleSuffix = ExtensionCombo.SelectedItem.ToString() switch { // 英文选项匹配逻辑 "StudentCode_Draft" => "_Draft", "StudentCode_Final" => "_Final", // 如果你要换成中文选项就启用下面的匹配逻辑 // "学号_草稿" => "_Draft", // "学号_终稿" => "_Final", _ => string.Empty }; if(string.IsNullOrEmpty(ruleSuffix)) return; foreach (FileInfo file in wordFiles) { // 拆分源文件名提取StudentCode string fileNameWithoutExt = Path.GetFileNameWithoutExtension(file.Name); string[] nameParts = fileNameWithoutExt.Split('_'); // 校验源文件名格式是否符合要求 if(nameParts.Length < 2) continue; string studentCode = nameParts[1]; // 拼接新文件名 string newFileName = $"{studentCode}{ruleSuffix}.docx"; string newFullPath = Path.Combine(targetDir, newFileName); // 重名判断,避免覆盖原有文件 if(File.Exists(newFullPath)) { MessageBox.Show($"文件{newFileName}已存在,跳过当前文件"); continue; } // 需要保留原文件就用Copy,直接重命名就用Move // File.Copy(file.FullName, newFullPath); File.Move(file.FullName, newFullPath); } Refresh(); MessageBox.Show("重命名完成"); }
4. 补充说明
- ComboBox的选项如果需要切换为中文,可设置为:
学号_草稿、学号_终稿,对应修改代码里的switch匹配逻辑即可 - 如果担心源文件名拆分出错,可以加更多格式校验逻辑,避免提取到错误的学号字段
内容的提问来源于stack exchange,提问作者JayC
相关产品推荐
相关产品推荐

