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

ASP.NET Core 6 MVC迁移至Ubuntu后下拉框PDF文件排序异常求助

ASP.NET Core 6 MVC迁移至Ubuntu Apache2后PDF文件名排序异常问题

将ASP.NET Core 6 MVC Web应用从IIS迁移到Ubuntu 22.04+Apache2环境后,下拉选择框中的PDF文件名排序异常。但在Visual Studio本地运行、Windows IIS部署时排序均正常,怀疑是Ubuntu系统导致。以下是当前将文件添加至下拉框的代码:

public static UserFile GetPdfFiles(UserFile userFile, string webRootPath, string fileDirectoryPath)
{
    string fullPath = $"{webRootPath}{fileDirectoryPath}";
    int nId = 1;

    userFile.Files = new List<SelectListItem>();

    foreach (string pdfPath in Directory.EnumerateFiles(fullPath, "*.pdf"))
    {
        userFile.Files.Add(new SelectListItem
        {
            Text = Path.GetFileName(pdfPath),
            Value = nId.ToString(),
        });

        nId++;
    }

    int listCount = userFile.Files.Count - 1;
    userFile.Name = userFile.Files[listCount].Text;
    userFile.Path = fileDirectoryPath.Replace('\\', '/');

    return userFile;        
}

Ubuntu环境效果
Ubuntu下拉框效果

Windows/本地环境效果
Windows下拉框效果


问题原因与解决方案

问题根源是Windows和Linux的文件系统排序规则差异:Windows默认使用不区分大小写的字典序,而Ubuntu默认区分大小写且排序逻辑依赖系统区域设置,Directory.EnumerateFiles返回的文件顺序由操作系统决定,因此跨平台出现不一致。

修改代码,手动对文件名进行统一排序,避免依赖系统默认行为:

public static UserFile GetPdfFiles(UserFile userFile, string webRootPath, string fileDirectoryPath)
{
    string fullPath = $"{webRootPath}{fileDirectoryPath}";
    int nId = 1;

    // 获取所有PDF文件并按文件名不区分大小写排序
    var pdfFiles = Directory.EnumerateFiles(fullPath, "*.pdf")
                           .OrderBy(path => Path.GetFileName(path), StringComparer.OrdinalIgnoreCase)
                           .ToList();

    userFile.Files = new List<SelectListItem>();

    foreach (string pdfPath in pdfFiles)
    {
        userFile.Files.Add(new SelectListItem
        {
            Text = Path.GetFileName(pdfPath),
            Value = nId.ToString(),
        });

        nId++;
    }

    int listCount = userFile.Files.Count - 1;
    if (listCount >= 0) // 增加空列表判断,避免索引越界
    {
        userFile.Name = userFile.Files[listCount].Text;
    }
    userFile.Path = fileDirectoryPath.Replace('\\', '/');

    return userFile;        
}

关键修改点:

  • 使用OrderBy结合StringComparer.OrdinalIgnoreCase实现跨平台一致的不区分大小写排序
  • 增加空列表判断,防止目录无PDF文件时出现索引越界异常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:01:19