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

C#中文件名字符数多于文件路径的异常问题咨询

问题分析与解决方案

嘿,这个问题其实一眼就能揪出根源——你在生成fileName的时候重复拼接了文件扩展名,才导致了这种反直觉的长度异常!

具体问题拆解

看你代码里的这行关键代码:

string fileName = System.IO.Path.GetFileName(file) + System.IO.Path.GetExtension(file);

System.IO.Path.GetFileName(file)这个方法本身就已经包含了文件的完整文件名(包括扩展名)!举个实际例子:如果file的路径是C:\Projects\Demo.exe,GetFileName返回的是Demo.exe,而GetExtension返回的是.exe,两者拼接后就变成了Demo.exe.exe——相当于给文件名平白多套了一层扩展名,字符数自然会暴涨,甚至在原路径本身比较短的情况下,会出现拼接后的文件名长度超过完整路径长度的情况,也就是你遇到的fileName.Length(288)大于file.Length(281)的异常。

修正后的代码

只需要直接用GetFileName获取完整的文件名(含扩展名)就可以了,完全不需要额外拼接扩展名:

string[] allfiles = Directory.GetFiles(@"directory", "*.*", SearchOption.AllDirectories);
using (var output = new System.IO.StreamWriter(@"C:\Output.txt"))
{
    foreach (string file in allfiles)
    {
        string fileName = System.IO.Path.GetFileName(file);
        string line = file.Replace(',', '?') + "," + file.Length.ToString() + "," + fileName.Length.ToString() + "," + fileName;
        output.WriteLine(line);
    }
}

额外提一句:如果你本来是想手动拆分“无扩展名的文件名”和“扩展名”再拼接,那应该用Path.GetFileNameWithoutExtension(file) + Path.GetExtension(file),但这和直接调用GetFileName的结果完全一致,属于多此一举的操作。

对应你的案例验证

从你给出的数值来看,fileName.Length比file.Length多了7个字符(288-281=7),这说明你的目标文件的扩展名刚好是7个字符(比如.archive这类长扩展名),错误拼接后相当于把扩展名多写了一遍,刚好凑出了这个长度差,完美对应你遇到的异常现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 12:57:36