Windows下检测文件名大小写是否匹配
跨平台开发有一个众所周知,但因为只是偶尔受到困扰,一般人不会在意的问题,就是windows对文件名大小写不敏感,而其他平台对文件名大小写敏感。因此可能出现在windows平台开发时一切正常,但部署/打包到其他平台下,运行时加载文件会失败。我对于这种问题也是不甚在意的,一般都是打包/部署时把所有文件转小写保存,加载文件时也把文件名转小写。不采取这种方法,一般公司也都有制定流程,可以避免出现此类问题。
但再好的流程也是需要人执行的,如果执行不到位,比如美术上传资源不按规范,或者策划填表不按规范,就会出问题了。所以有前同事问我有没有检测的方法,我就尝试了一下。
首先我想到的是FileInfo的Name属性,一看就是干这事的,但是真正使用时发现,如果你以小写的名字创建FileInfo,那么创建的FileInfo的Name属性也是小写的名字,并不是实际的名字。然后我就想到了逐级遍历文件夹,总是可以区分大小写,找到是否匹配的。于是经过几番测试,解决了该问题,最终代码如下:
public static class Tools { public static bool IsCaseMatch(string path) { path = path.Replace('\\', '/'); string[] pathes = path.Split('/'); DirectoryInfo dir = new DirectoryInfo("."); for (int i = 0; i < pathes.Length - 1; i++) { DirectoryInfo[] dirs = dir.GetDirectories(pathes[i]); if (dirs.Length == 0) return false; DirectoryInfo dir2 = null; for (int j = 0; j < dirs.Length; j++) { if (dirs[j].Name == pathes[i]) { dir2 = dirs[j]; break; } } if (dir2 == null) return false; dir = dir2; } FileInfo[] files = dir.GetFiles(pathes[pathes.Length - 1]); if (files.Length == 0) return false; for (int i = 0; i < files.Length; i++) { if (files[i].Name == pathes[pathes.Length - 1]) return true; } return false; } }
目前版本只能检测相对路径,不能检测绝对路径(实际工程加载自带资源一般也不会使用绝对路径)