2014-05-27 3 views
1

, поэтому у меня есть следующий код, который генерирует хэш-файл sha256 файла данных файла, который был загружен пользователем. Это прекрасно работает, но иногда оно включает незаконные символы (для окон os).Regex.Replace overload?

Так что я пытаюсь реализовать, это попытка поймать полосу незаконных символов. Я вытащил эту информацию с самого сайта Microsoft. Однако, когда он реализован с Regex.Replace(), мне говорят, что он принимает только 5 перегрузок.

Что сбивает с толку, потому что это то, что у меня есть, и я проверил трижды, что моя hashedfile1name является переменной типа строки.

Другая проблема заключается в том, что при попытке поймать его говорит мне, что он не знает, что такое 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\[email protected]]", "", 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

Какую версию рамки вы используете? Похоже, что перегрузка, которую вы пытаетесь использовать, была добавлена ​​в 4.5 и не будет доступна вам в ранних версиях. – GalacticCowboy

+0

Какая версия .NET вы используете? Эта перегрузка поддерживается только в .NET 4.5 и выше. –

+0

'RegexMatchTimeoutException' был добавлен также в .Net 4.5. http://msdn.microsoft.com/en-us/library/vstudio/system.text.regularexpressions.regexmatchtimeoutexception(v=vs.110).aspx –

ответ

2

Regex.Replace не заменяет на месте; он возвращает замену как строку. Сегмент:

try 
{ 
    Regex.Replace(hashedfile1name, @"[^\w\[email protected]]", "", RegexOptions.None, TimeSpan.FromSeconds(1.5)); 
} 
catch (RegexMatchTimeoutException) 
{ 
    hashedfile1name = ""; 
} 

Может быть заменен просто:

hashedfile1name = Regex.Replace(hashedfile1name, @"[^\w\[email protected]]", ""); 

Ваш код должен функционировать как ожидается.

(Если вы хотите сохранить весь хэш, вы можете рассмотреть кодировку Base-32, которая похожа на base64, но использует только буквенно-цифровые символы. NET не включает методы Base32, но реализация предоставляется в ответе Шейна here.)