字符串替换多个字符(使有效的文件夹名称)
给定一个字符串和字符数组:字符串替换多个字符(使有效的文件夹名称)
string userDir = WindowsIdentity.GetCurrent().Name;
char[] chars Path.GetInvalidPathChars();
如果要替换“字符”全部字符在“用户目录”串作出有效目录名称不在用户名中。或者我可以假设每个用户名是一个有效的目录?
我最好的想法是嵌套两个循环......但我正在寻找一个更短的解决方案。
或者还有其他方法来生成有效的目录名称?
假设你的代码:
string userDir = WindowsIdentity.GetCurrent().Name;
char[] chars = Path.GetInvalidPathChars();
你总是可以这样做:
Array.ForEach(chars, c => userDir = userDir.Replace(c, '_'));
要以下划线(或任何中立性,你想......)更换任何无效字符。
UPDATE:正如史蒂夫法洛斯指出,\
和:
是有效的路径字符但不是有效的文件夹名称字符。相反,我们应该使用Path.GetInvalidFileNameChars()
方法:
char[] chars = Path.GetInvalidFileNameChars();
然后继续和以前一样。
两个注意事项:GetInvalidPathChars()不包含':'和'\',它们是有效的*路径*字符,但在一个文件夹级别名称中无效。此外,Array.ForEach必须返回给userDir var以实际更改字符串。查看我的答案,获得稍微更健壮的版本。 – 2012-06-29 15:57:26
@SteveFallows:感谢您的更正:-)我会更新我的答案。 – 2012-06-29 18:07:05
// 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, "_");
基于詹姆斯·迈克尔·黑尔的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_;
}
基于用户名称的文件夹是什么样的?如果您需要他们的用户文件夹或其下的文件夹,请使用'Environment.GetFolderPath()'以及'Environment.SpecialFolders'枚举。 – dlev 2012-03-14 19:19:16