使用System.IO.File.Move重命名文件遇FileNotFoundException,手动路径仍报错
解决文件重命名“找不到文件”的问题
问题原因分析
你的代码和测试中存在几个关键问题:
- 路径处理逻辑错误:
button2_Click里的oldFilePath.Remove(oldFilePath.Length-newFilePath.Length)会错误截断原文件路径,导致生成的源路径无效。 - @符号误用:
@oldFilePath这种写法是错误的,@仅用于硬编码的字符串字面量,不能加在变量前。 - 手动测试路径可能不完整:如果测试的文件带有扩展名(比如
.txt),但你写的路径没包含扩展名,系统自然找不到文件。
修正方案
1. 修正路径拼接逻辑
不要手动截断路径,用Path类的方法安全获取目录并拼接新路径,这是处理文件路径的标准方式。
2. 移除无效的@符号
直接使用变量即可,无需加@。
3. 增加文件存在检查与异常捕获
避免因文件不存在或权限问题导致的报错,同时给出明确提示。
修正后的完整代码示例
// 确保oldFilePath是类级别的成员变量 private string oldFilePath; private void button1_Click(object sender, EventArgs e) { OpenFileDialog openfiledialog = new OpenFileDialog(); if (openfiledialog.ShowDialog() == System.Windows.Forms.DialogResult.OK) { oldFilePath = openfiledialog.FileName; listBox1.Items.Add(oldFilePath); } } private void button2_Click(object sender, EventArgs e) { string newFileName = textBox1.Text; if (string.IsNullOrEmpty(newFileName)) { MessageBox.Show("请输入新文件名"); return; } // 获取原文件所在目录 string fileDir = Path.GetDirectoryName(oldFilePath); // 如果用户没输入扩展名,自动保留原文件的扩展名 if (!Path.HasExtension(newFileName)) { newFileName += Path.GetExtension(oldFilePath); } // 拼接新的完整路径 string newFilePath = Path.Combine(fileDir, newFileName); // 检查原文件是否存在 if (File.Exists(oldFilePath)) { try { File.Move(oldFilePath, newFilePath); MessageBox.Show("重命名成功"); // 可以更新列表框显示新路径 listBox1.Items.Remove(oldFilePath); listBox1.Items.Add(newFilePath); } catch (Exception ex) { MessageBox.Show($"操作失败:{ex.Message}"); } } else { MessageBox.Show("原文件不存在,请确认路径"); } }
手动测试注意事项
如果要手动测试File.Move,必须确保路径包含完整的文件名和扩展名,比如:
System.IO.File.Move(@"D:\Users\XXX\Desktop\TestOrHMoin.txt", @"D:\Users\XXX\Desktop\TestOrHMoinNEW.txt");
内容的提问来源于stack exchange,提问作者TheLooser2
相关产品推荐
相关产品推荐

