跨平台開發有一個眾所周知,但因為只是偶爾受到困擾,一般人不會在意的問題,就是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; } }
目前版本只能檢測相對路徑,不能檢測絕對路徑(實際工程加載自帶資源一般也不會使用絕對路徑)