我需要一个函数,它提供从字符串到另一个字符串的一对一映射,但输出字符串是一个文件的正确名称的nice属性。
更具体地说,我的问题是,给定一个图像的URL,我想用给定该URL的唯一名称保存图像。我需要这样的代码
string url;
string uniqueName = UrlToName (url);
string fileName = path + uniqueName + ".png";
问题是如何获得UrlToName
功能。可能的解决方案可能是GetHashCode
,但我不知道它是否正确。
答案 0 :(得分:2)
最好的办法是使用数据库 - 为每个文件创建一个新行,将Uri存储在一列中,将生成的文件名存储在另一列中(例如Guid.NewGuid()。ToString()+" .PNG"。)
这不受文件名长度的任何问题的影响(NTFS中约为255个字符,而URL可能为~2000),不存在哈希冲突的可能性,随着数据库的增长,您可以随着时间的推移改进存储算法,例如,添加目录以便在单个目录中不会出现太多文件(这使得它在资源管理器中无法使用)。
如果您根据外部输入在服务器上创建文件名,则还应该关注安全风险。 this answer中的大部分建议也适用于此。
答案 1 :(得分:0)
尝试这样的事情:
private string UrlToName(string url)
{
foreach (char c in System.IO.Path.GetInvalidFileNameChars())
{
url = url.Replace(c, '_');
}
return url;
}
这将确保它具有有效的文件名字符。只要传入的url是唯一的,那么这个函数应该总是返回一个唯一的字符串。
如果确实需要一个真正唯一的名称,即使传入相同的URL,请尝试以下方法:
private string UrlToName(string url)
{
url = url + "_" + DateTime.Now.ToString("o");
foreach (char c in System.IO.Path.GetInvalidFileNameChars())
{
url = url.Replace(c, '_');
}
return url;
}
这将添加一个日期戳,直到字符串结尾的毫秒数。除非你传入完全相同的URL,同样精确到毫秒(极不可能),否则每次都会得到一个唯一的字符串。