2012-03-14 98 views
3

给定一个字符串和字符数组:字符串替换多个字符(使有效的文件夹名称)

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

如果要替换“字符”全部字符在“用户目录”串作出有效目录名称不在用户名中。或者我可以假设每个用户名是一个有效的目录?

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

或者还有其他方法来生成有效的目录名称?

+2

基于用户名称的文件夹是什么样的?如果您需要他们的用户文件夹或其下的文件夹,请使用'Environment.GetFolderPath()'以及'Environment.SpecialFolders'枚举。 – dlev 2012-03-14 19:19:16

回答

7

假设你的代码:

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

你总是可以这样做:

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

要以下划线(或任何中立性,你想......)更换任何无效字符。

UPDATE:正如史蒂夫法洛斯指出,\:是有效的路径字符但不是有效的文件夹名称字符。相反,我们应该使用Path.GetInvalidFileNameChars()方法:

char[] chars = Path.GetInvalidFileNameChars(); 

然后继续和以前一样。

+0

两个注意事项:GetInvalidPathChars()不包含':'和'\',它们是有效的*路径*字符,但在一个文件夹级别名称中无效。此外,Array.ForEach必须返回给userDir var以实际更改字符串。查看我的答案,获得稍微更健壮的版本。 – 2012-06-29 15:57:26

+0

@SteveFallows:感谢您的更正:-)我会更新我的答案。 – 2012-06-29 18:07:05

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

基于詹姆斯·迈克尔·黑尔的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_; 
} 

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

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