Заменить несколько символов в строке (сделать правильное имя папки) - PullRequest
3 голосов
/ 14 марта 2012

Имеется строка и массив символов:

string userDir = WindowsIdentity.GetCurrent().Name;
char[] chars Path.GetInvalidPathChars();

Если вы хотите заменить все символы в "chars" в строке "userDir", чтобы сделать правильное имя каталога из имени пользователя.Или я могу предположить, что каждое имя пользователя является допустимым каталогом?

Лучшая идея, которую я имею, это вложение двух циклов ... но я ищу более короткое решение.

Или естьдругой метод для создания правильного имени каталога?

Ответы [ 3 ]

7 голосов
/ 14 марта 2012

Принимая ваш код:

string userDir = WindowsIdentity.GetCurrent().Name;
char[] chars = Path.GetInvalidPathChars();

Вы всегда можете сделать:

Array.ForEach(chars, c => userDir = userDir.Replace(c, '_'));

Заменить любой недопустимый символ подчеркиванием (или любым нейтральным символом, который вы хотите ...).

ОБНОВЛЕНИЕ : Как указал Стив Фэллоуз, \ и : являются допустимыми символами пути, но не действительными символами имени папки.Вместо этого мы должны использовать метод Path.GetInvalidFileNameChars():

char[] chars = Path.GetInvalidFileNameChars();

, а затем продолжить, как и раньше.

1 голос
/ 29 июня 2012

Основываясь на ответе Джеймса Майкла Хэра , вот немного более надежная версия для исправления строки, которая должна использоваться в качестве уровня отдельной папки в пути:

private string ReplaceInvalidFolderNameChars(string proposedFolderName_)
{
    char[] chars = Path.GetInvalidPathChars();
    Array.Resize(ref chars, chars.Length + 2);
    chars[chars.Length - 2] = ':';
    chars[chars.Length - 1] = '\\';
    Array.ForEach(chars, c => proposedFolderName_ = proposedFolderName_.Replace(c, '_'));
    return proposedFolderName_;
}

ОБНОВЛЕНИЕ : упрощенная версия, основанная на обновлении Джеймса:

private string ReplaceInvalidFolderNameChars(string proposedFolderName_)
{
    char[] chars = Path.GetInvalidFilenameChars();
    Array.ForEach(chars, c => proposedFolderName_ = proposedFolderName_.Replace(c, '_'));
    return proposedFolderName_;
}
1 голос
/ 14 марта 2012
// This only needs to be initialized once.
var invalidChars = Path.GetInvalidPathChars().Select(c => Regex.Escape(c.ToString()));
Regex regex = new Regex(string.Join("|", invalidChars));

// Replace all invalid characters with "_".
userDir = regex.Replace(userDir, "_");
...