将url转换为有效的文件名并返回到url

时间:2010-12-12 18:23:04

标签: c# url filenames

我需要存储一些对我的用户访问的每个站点唯一的信息。 (它实际上是他所看过的网站的缩略图。)
这个缩略图(jpeg文件)需要有一个名称,表明它代表了哪个网站,以便稍后查看。

您能推荐从网址到有效文件名的简单翻译吗?

示例:www.ibm.com可以映射到www_ibm_com

在某些情况下,我不确定这是否始终适用于所有有效网址。网址具有非常复杂的查询字符串。

是否有可以使用的正则表达式或c#库?

提前致谢并感到高兴。

2 个答案:

答案 0 :(得分:2)

首先值得指出的是“。”在文件名中是完全合法的,但“/”不是,所以虽然你引用的例子不需要翻译,“www.ibm.com/path1/file1.jpg”会。

简单的string.Replace将是最好的解决方案 - 假设您可以找到一个在文件名中合法但在网址中非法的字符。

假设非法的URL字符是“§”(在URL中可能是合法的),那么你有:

string.Replace("/", "§");

转换为文件名并:

string.Replace("§", "/");

转回来。

This page on URL Encoding定义了URLS的有效,无效和不安全(有效但具有特殊含义)字符。 ISO-Latin集合80-FF十六进制(128-255十进制)的“上半部分”中的字符不合法,但文件名可能正常。

您需要对URL中的每个字符执行此操作,该字符位于无效文件名字符集中。您可以使用GetInvalidFileNameChars来获取此内容。

<强>更新

假设您找不到合适的字符对,那么另一种解决方案就是使用查找表。一列保存URL,另一列保存生成的文件名。只要生成的名称是唯一的(GUID就可以),您可以进行双向查找以从一个查找到另一个。

答案 1 :(得分:1)

www.ibm.com实际上是一个有效的文件名。更有问题的是斜线。因此,如果URL包含子目录,则需要翻译斜杠。

那么主要问题是可能重复。例如,ibm.com/path1_path2和ibm.com/path1/path2都会转换为相同的值。

我喜欢ChrisF的建议,即找到一个在文件名中合法但在URL中不合法的字符,尽管我甚至不知道哪个字符(如果有的话)不在我的头脑中。

如果你没有找到这样的角色,那么你可能需要坚持使用不太可能的角色。