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;
    }
}

目前版本只能檢測相對路徑,不能檢測絕對路徑(實際工程加載自帶資源一般也不會使用絕對路徑)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM