【发布时间】:2019-05-17 17:05:33
【问题描述】:
我需要在 C# 中处理一些可能包含非法字符的文件路径,例如:
C:\path\something\output_at_13:26:43.txt
在那个路径中,时间戳中的:s 使文件名无效,我想用另一个安全字符替换它们。
我已经在 SO 上搜索了解决方案,但它们似乎都基于以下内容:
path = string.Join("_", path.Split(Path.GetInvalidFileNameChars()));
或类似的解决方案。然而,这些解决方案并不好,因为它们搞砸了驱动器号,我得到了以下输出:
C_\path\something\output_at_13_26_43.txt
我尝试使用Path.GetInvalidPathChars(),但它仍然不起作用,因为它没有在非法字符中包含:,所以它不会替换文件名中的那些。
所以,在弄清楚这一点后,我尝试这样做:
string dir = Path.GetDirectoryName(path);
string file = Path.GetFileName(path);
file = string.Join(replacement, file.Split(Path.GetInvalidFileNameChars()));
dir = string.Join(replacement, dir.Split(Path.GetInvalidPathChars()));
path = Path.Combine(dir, file);
但这也不好,因为文件名中的:s 似乎干扰了Path.GetFilename() 逻辑,它只返回最后一个: 之后的最后一个,所以我丢失了路径。
如何在没有 hacky 解决方案的情况下“正确”执行此操作?
【问题讨论】:
-
驱动器号总是 2 个字符长,所以你应该做类似
string driveLetter = path.Substring(0, 2); path = path.Substring(2, path.Length-2);这样你在driveLetter和“\path\something\output_at_13:26”中有“C:” :43.txt" 在path。在path中应用替换并执行Path.Combine(driveLetter, path); -
你打败了我@ikerbera。不过,您可以在第二个子字符串调用中省略第二个参数。
-
@ikerbera - “驱动器号总是 2 个字符长”,但前提是它存在,它不一定存在(例如相对路径、UNC 路径)。