C#移动未知文件名文件触发ArgumentException:空文件名非法求助
解决文件移动时的Empty file name异常问题
嘿,我来帮你排查这个异常!你遇到的System.ArgumentException: 'Empty file name is not legal. Parameter name: sourceFileName'错误,根源出在你获取源文件路径的逻辑上,咱们一步步拆解问题:
核心错误点
- 你在循环里写了这行代码:
这里传入string strSourceFile = Path.GetFileName(@"\\company\Archive\\IN\InvoiceTest\Inbox\");Path.GetFileName的是目录路径,不是具体的文件路径。Path.GetFileName的作用是从完整路径中提取文件名部分,当你传入目录路径时,它返回的是空字符串——这就导致File.Move的sourceFileName参数为空,直接触发了这个异常。 - 另外还有个潜在的路径拼写问题:目标目录写的是
@"\\company\ArchiveIN\InvoiceTest\Archive\",对比源目录的Archive\IN,这里明显少了一个反斜杠,应该是@"\\company\Archive\IN\InvoiceTest\Archive\",否则可能会找不到目标目录。 - 额外提一句:你先获取
fileCount再执行文件移动,这个判断逻辑有点滞后——即使循环里移走了文件,fileCount还是初始的数值,不过这不是当前异常的原因,咱们可以一起优化。
修正后的代码
public bool ArchiveFile() { // 把路径提取成变量,方便维护和避免拼写错误 string sourceDirectory = @"\\company\Archive\IN\InvoiceTest\Inbox\"; string destinationDirectory = @"\\company\Archive\IN\InvoiceTest\Archive\"; // 确保目标目录存在,避免"找不到路径"的异常 if (!Directory.Exists(destinationDirectory)) { Directory.CreateDirectory(destinationDirectory); } DirectoryInfo dirInfo = new DirectoryInfo(sourceDirectory); FileInfo[] filesToArchive = dirInfo.GetFiles(); int fileCount = filesToArchive.Length; // 先判断是否有文件,没有直接提示返回,不用进入循环 if (fileCount == 0) { string message = $"No file found in directory:\n\n{sourceDirectory}"; MessageBox.Show(message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); return false; } foreach (var file in filesToArchive) { // 直接用FileInfo的FullName获取完整的源文件路径 string sourceFilePath = file.FullName; // 用Path.Combine拼接目标路径,保证格式正确 string destinationFilePath = Path.Combine(destinationDirectory, file.Name); // 可选:避免覆盖已存在的归档文件 if (File.Exists(destinationFilePath)) { MessageBox.Show($"File '{file.Name}' already exists in the archive directory.", "Warning", MessageBoxButtons.OK, MessageBoxIcon.Warning); continue; } File.Move(sourceFilePath, destinationFilePath); } return true; }
关键修改说明
- 路径变量化:把源/目标目录提取成变量,减少拼写错误,也方便后续修改。
- 目标目录预检查:提前创建不存在的目标目录,防止移动时抛出路径不存在的异常。
- 合理的逻辑顺序:先判断是否有文件,没有直接提示返回,避免无效循环。
- 正确获取文件路径:循环中直接使用
FileInfo的FullName属性获取完整源路径,Name属性获取文件名,彻底解决空文件名的问题。 - 增加覆盖保护:可选的文件存在判断,避免意外覆盖已归档的文件,你可以根据业务需求调整这部分逻辑。
内容的提问来源于stack exchange,提问作者Joe
相关产品推荐
相关产品推荐

