给定一个字符串和一个字符数组:
string userDir = WindowsIdentity.GetCurrent().Name;
char[] chars Path.GetInvalidPathChars();
如果想要将"userDir"字符串中所有"chars"字符替换为有效的目录名称,以便将用户名作为目录名。或者我可以假设每个用户名都是有效的目录?
我目前想到的最好方法是嵌套两个循环...但我正在寻找更短的解决方案。
还有其他方法生成有效的目录名称吗?
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();
// 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, "_");
基于James Michael Hare的答案,这里是一个稍微更健壮的版本,用于纠正作为路径中单个文件夹级别使用的字符串:
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_;
}
Environment.GetFolderPath()
与Environment.SpecialFolders
枚举。 - dlev