就像这样,保持你的黑客。
在普通的Win32中,有一个辅助函数PathAddBackslash可以实现这个功能。只需与目录分隔符保持一致:检查Path.DirectorySeparatorChar
和Path.AltDirectorySeparatorChar
而不是硬编码\
。
更新:如果您的目标是任何较新的.NET版本(Core 3.0及以上),则可以使用一些较新的函数:
string PathAddDirectorySeparator(string path)
{
if (path is null)
throw new ArgumentNullException(nameof(path));
path = path.TrimEnd();
if (Path.EndsInDirectorySeparator(path))
return path;
return path + GetDirectorySeparatorUsedInPath();
char GetDirectorySeparatorUsedInPath()
{
if (path.Contains(Path.AltDirectorySeparatorChar))
return Path.AltDirectorySeparatorChar;
return Path.DirectorySeparatorChar;
}
}
如果你决定不支持
Path.AltDirectorySeparatorChar
,并且你不介意额外的字符串分配,那么考虑使用
Path.TrimEndingDirectorySeparator(path)
而不是简单地使用
path.TrimEnd('\\')
。
原始答案:类似这样(请注意没有严格的错误检查):
string PathAddBackslash(string path)
{
string separator1 = Path.DirectorySeparatorChar.ToString();
string separator2 = Path.AltDirectorySeparatorChar.ToString();
path = path.TrimEnd();
if (path.EndsWith(separator1) || path.EndsWith(separator2))
return path;
if (path.Contains(separator2))
return path + separator2;
return path + separator1;
}
为什么需要这么多代码?主要是因为,如果用户输入/windows/system32
,你不希望得到/windows/system32\
,而是/windows/system32/
。关键在于细节......
为了更好地自我解释,将所有内容整合在一起:
string PathAddBackslash(string path)
{
if (path == null)
throw new ArgumentNullException(nameof(path));
path = path.TrimEnd();
if (PathEndsWithDirectorySeparator())
return path;
return path + GetDirectorySeparatorUsedInPath();
bool PathEndsWithDirectorySeparator()
{
if (path.Length == 0)
return false;
char lastChar = path[path.Length - 1];
return lastChar == Path.DirectorySeparatorChar
|| lastChar == Path.AltDirectorySeparatorChar;
}
char GetDirectorySeparatorUsedInPath()
{
if (path.Contains(Path.AltDirectorySeparatorChar))
return Path.AltDirectorySeparatorChar;
return Path.DirectorySeparatorChar;
}
}
即使看起来如此,file://
URI格式也不被处理。正确的做法是像其他.NET I/O函数一样:不要处理此格式(并可能引发异常)。
作为替代方案,您始终可以导入Win32函数:
[DllImport("shlwapi.dll",
EntryPoint = "PathAddBackslashW",
SetLastError = True,
CharSet = CharSet.Unicode)]
static extern IntPtr PathAddBackslash(
[MarshalAs(UnmanagedType.LPTStr)]StringBuilder lpszPath);
"\\"
替换为Path.DirectorySeparatorChar
。 - Rotsvar baseDir = AppDomain.CurrentDomain.BaseDirectory;
baseDir = baseDir.EndsWith(Path.DirectorySeparatorChar.ToString()) ? baseDir : baseDir + Path.DirectorySeparatorChar;
- ewilan