所以我有以下代码,它生成用户上传的文件的文件数据的sha256哈希值。这样可以正常工作,但有时它包含非法字符(对于Windows操作系统)。
所以我试图实现的是试图去除非法字符。我从微软的网站上取消了这些信息。但是,当使用Regex.Replace()
实施时,我告诉它只接受5次重载。
这是令人困惑的,因为这就是我所拥有的,并且我已经三次检查我的hashedfile1name
是字符串类型变量。
另一个问题是,对于try catch它告诉我它不知道RegexMatchTimeoutException
是什么。但Microsoft's example中没有更多的导入/使用语句。
try
{
FileUpload1.SaveAs("C:\\direct\\uploads\\" + FileUpload1.FileName);
using (fs = File.OpenRead("C:\\direct\\uploads\\" + FileUpload1.FileName))
{
byte[] bytes = new byte[fs.Length];
fs.Read(bytes, 0, Convert.ToInt32(fs.Length));
hashedfile1name = Convert.ToBase64String(hash.ComputeHash(bytes));
}
try
{
Regex.Replace(hashedfile1name, @"[^\w\.@-]", "", RegexOptions.None, TimeSpan.FromSeconds(1.5));
}
catch (RegexMatchTimeoutException)
{
hashedfile1name = "";
}
FileUpload1.SaveAs("C:\\direct\\uploads\\" + hashedfile1name);
File.Delete("C:\\direct\\uploads\\" + FileUpload1.FileName);
Label1.Text = "File name: " + FileUpload1.PostedFile.FileName + " - " + hashedfile1name;
}
catch (Exception ex)
{
Label1.Text = "ERROR: " + ex.Message.ToString();
}
答案 0 :(得分:2)
Regex.Replace
不会就地取代;它将替换作为字符串返回。细分:
try
{
Regex.Replace(hashedfile1name, @"[^\w\.@-]", "", RegexOptions.None, TimeSpan.FromSeconds(1.5));
}
catch (RegexMatchTimeoutException)
{
hashedfile1name = "";
}
可以简单地替换:
hashedfile1name = Regex.Replace(hashedfile1name, @"[^\w\.@-]", "");
您的代码应按预期运行。
(如果要保留整个哈希,可能需要考虑Base-32编码,类似于base64但只使用字母数字字符..NET不包含Base32方法,但提供了一个实现在Shane的回答中here。)