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

3

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

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

如果想要将"userDir"字符串中所有"chars"字符替换为有效的目录名称,以便将用户名作为目录名。或者我可以假设每个用户名都是有效的目录?

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

还有其他方法生成有效的目录名称吗?


2
你基于用户名称需要哪种类型的文件夹?如果你需要他们的用户文件夹或者该文件夹下的子文件夹,那么可以使用Environment.GetFolderPath()Environment.SpecialFolders枚举。 - dlev
3个回答

8
假设您的代码如下:
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();

然后继续之前的步骤。

两个注意事项:GetInvalidPathChars() 不包括 ':' 和 '',它们是合法的 路径 字符但不在一个文件夹级别名称中合法。另外 Array.ForEach 必须将结果赋回给 userDir 变量才能真正更改字符串。请参阅我的答案以获得稍微更健壮的版本。 - Steve Fallows

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接