找回密码
 立即注册

QQ登录

只需一步,快速开始

gw0506

超级版主

181

主题

4212

帖子

9049

积分

超级版主

Rank: 8Rank: 8

积分
9049

活字格认证

gw0506
超级版主   /  发表于:2009-12-24 17:21  /   查看:13653  /  回复:10
创建文件名,一般都有不被接受的非法字符。
在VS2008下,创建个FileName.cs当然没有问题。但是如果搞一个FileName(subname).cs呢?
看似ok,其实有个小坑~~

以VS2008为例,proj文件里会把工程中用到的文件以xml格式保存起来。这是括号()就会被分别用ascii码来代替。也就是说,proj文件中保存的文件名变成了  FileName%28subname%29.cs  但是你在IDE中看到的仍然是FileName(subname).cs。

所以,如果需要直接从proj文件里去文件名的话,肯定就找不到那个文件啦~~~

劝一句小心小心,望各位提防提防~~~

10 个回复

倒序浏览
Leo
超级版主   /  发表于:2009-12-24 17:28:00
沙发
可以用以下代码解决:
private static string NormalizeFileName(string fileName)
        {
            try
            {
                System.Text.RegularExpressions.Regex regex = new System.Text.RegularExpressions.Regex(@"(?<HEX>%\d{2})");
                System.Text.RegularExpressions.MatchCollection matches = regex.Matches(fileName);
                Dictionary<string, char> mappingTable = new Dictionary<string, char>();
                foreach (System.Text.RegularExpressions.Match match in matches)
                {
                    if (!match.Success)
                    {
                        return fileName;
                    }

                    string matchStr = match.Value;
                    if (!mappingTable.ContainsKey(matchStr))
                    {
                        mappingTable.Add(matchStr, HexToChar(matchStr.Substring(1)));
                    }
                }

                if (mappingTable.Keys.Count == 0)
                {
                    return fileName;
                }

                string normalizedFileName = fileName;
                foreach (KeyValuePair<string, char> keyValuePair in mappingTable)
                {
                    normalizedFileName = normalizedFileName.Replace(keyValuePair.Key, keyValuePair.Value.ToString());
                }

                if (normalizedFileName.IndexOfAny(Path.GetInvalidFileNameChars()) >= 0)
                {
                    return fileName;
                }

                return normalizedFileName;
            }
            catch
            {
                return fileName;
            }
        }

        private static char HexToChar(string hexValue)
        {
            if (hexValue.Length != 2)
            {
                throw new ArgumentException("hexValue parameter must have two chars");
            }
            return (char)Convert.ToInt32(hexValue, 16);
        }
回复 使用道具 举报
Carl
版主   /  发表于:2009-12-24 18:04:00
板凳
楼上的解决方案好复杂,用这个不就搞定了么?
  1. Uri.UnescapeDataString(&quot;FileName%28subname%29.cs&quot;);
复制代码
愿 Engine 归于沉寂,Timer 停止运动,Message Queue 不再流淌,Data Source 为我掌握
回复 使用道具 举报
Leo
超级版主   /  发表于:2009-12-24 18:27:00
地板
鄙视一下楼主,他一百分肯定的告诉我,Uri类型不能解析&quot;(&quot;和&quot;)&quot;字符。然后这段复杂的代码就诞生了……
:-|:-|:-|:-|:-|:-|:-|
回复 使用道具 举报
Arthas
葡萄城公司职员   /  发表于:2009-12-24 19:12:00
5#
鄙视一下Leo,居然相信GW同学~~
扯淡第一高手
回复 使用道具 举报
robert
金牌服务用户   /  发表于:2009-12-25 08:50:00
6#
回复 使用道具 举报
winking
葡萄城公司职员   /  发表于:2009-12-25 08:59:00
7#
另外还可以适用System.Web.HttpUtility.UrlDecode(string)来取得同样的结果。
回复 使用道具 举报
graper
高级会员   /  发表于:2009-12-25 09:11:00
8#
条条大路通罗马,弱弱的顶一下:v:
回复 使用道具 举报
gw0506
超级版主   /  发表于:2009-12-25 09:13:00
9#
突然有了这么多解决方案。
被BS也值得了~
回复 使用道具 举报
graper
高级会员   /  发表于:2009-12-25 10:59:00
10#
我也要BS一下,我BS楼主只提问题,不给解决方案
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部