You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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; 
}

关键修改说明

  1. 路径变量化:把源/目标目录提取成变量,减少拼写错误,也方便后续修改。
  2. 目标目录预检查:提前创建不存在的目标目录,防止移动时抛出路径不存在的异常。
  3. 合理的逻辑顺序:先判断是否有文件,没有直接提示返回,避免无效循环。
  4. 正确获取文件路径:循环中直接使用FileInfo的FullName属性获取完整源路径,Name属性获取文件名,彻底解决空文件名的问题。
  5. 增加覆盖保护:可选的文件存在判断,避免意外覆盖已归档的文件,你可以根据业务需求调整这部分逻辑。

内容的提问来源于stack exchange,提问作者Joe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:49:13