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

目前版本只能检测相对路径,不能检测绝对路径(实际工程加载自带资源一般也不会使用绝对路径)

posted @ 2016-08-11 23:53  libla  阅读(2355)  评论(0编辑  收藏  举报