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环境效果
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
相关产品推荐
相关产品推荐

