给定一个字符串和一组字符:
string userDir = WindowsIdentity.GetCurrent().Name;
char[] chars Path.GetInvalidPathChars();
如果要替换“userDir”字符串中“chars”中的所有字符,请使用用户名创建有效的目录名称。或者我可以假设每个用户名都是有效的目录吗?
我最好的想法是嵌套两个循环...但我正在寻找一个更短的解决方案。
或者是否有其他方法可以生成有效的目录名称?
答案 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_;
}