替换字符串中的多个字符(生成有效的文件夹名称)

时间:2012-03-14 19:15:14

标签: c# string replace char

给定一个字符串和一组字符:

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

如果要替换“userDir”字符串中“chars”中的所有字符,请使用用户名创建有效的目录名称。或者我可以假设每个用户名都是有效的目录吗?

我最好的想法是嵌套两个循环...但我正在寻找一个更短的解决方案。

或者是否有其他方法可以生成有效的目录名称?

3 个答案:

答案 0 :(得分:7)

假设你的代码:

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

你总是可以这样做:

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

用下划线(或任何你想要的中性字符)替换任何无效的字符。

更新:正如Steve Fallows指出的那样,\:是有效的路径字符,但不是有效的文件夹名称字符。相反,我们应该使用Path.GetInvalidFileNameChars()方法:

char[] chars = Path.GetInvalidFileNameChars();

然后像以前一样继续。

答案 1 :(得分:1)

// 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, "_");

答案 2 :(得分:1)

基于James Michael Hare的answer,这是一个稍微强大的版本,用于纠正在路径中用作单个文件夹级别的字符串:

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_;
}

更新:基于James更新的简化版本:

private string ReplaceInvalidFolderNameChars(string proposedFolderName_)
{
    char[] chars = Path.GetInvalidFilenameChars();
    Array.ForEach(chars, c => proposedFolderName_ = proposedFolderName_.Replace(c, '_'));
    return proposedFolderName_;
}