我需要从其路径中获取目录名称,而不管是否有任何尾部反斜杠。例如,用户可以输入以下2个字符串之一,我需要日志目录的名称:
"C:\Program Files (x86)\My Program\Logs"
"C:\Program Files (x86)\My Program\Logs\"
以下均未给出正确答案("Logs"
):
Path.GetDirectoryName(m_logsDir);
FileInfo(m_logsDir).Directory.Name;
他们显然分析了路径字符串,并在第一个例子中确定Logs
是一个文件,而它确实是一个目录。
所以它应该检查最后一个单词(在我们的例子中是Logs
)是否真的是一个目录;如果是,则返回它,如果没有(日志也可能是文件),则返回父目录。如果需要处理实际的文件系统而不是分析字符串本身。
有没有标准功能呢?
答案 0 :(得分:5)
new DirectoryInfo(m_logsDir).Name;
答案 1 :(得分:3)
这可能会有所帮助
var result = System.IO.Directory.Exists(m_logsDir) ?
m_logsDir:
System.IO.Path.GetDirectoryName(m_logsDir);
答案 2 :(得分:1)
为此我们有一段代码:
m_logsDir.HasFlag(FileAttribute.Directory); //.NET 4.0
或
(File.GetAttributes(m_logsDir) & FileAttributes.Directory) == FileAttributes.Directory; // Before .NET 4.0
答案 3 :(得分:0)
让我重新解释一下我的答案,因为区分因素有两个潜在的缺陷。如果你这样做:
var additional = @"C:\Program Files (x86)\My Program\Logs\";
var path = Path.GetDirectoryName(additional);
您的输出将符合预期,Logs
。但是,如果你这样做:
var additional = @"C:\Program Files (x86)\My Program\Logs";
var path = Path.GetDirectoryName(additional);
您的输出将是My Program
,这会导致输出的差异。我会尝试强制执行结束\
,否则你可能会做这样的事情:
var additional = @"C:\Program Files (x86)\My Program\Logs";
var filter = additional.Split('\\');
var getLast = filter.Last(i => !string.IsNullOrEmpty(i));
希望这有帮助。
答案 4 :(得分:0)
沿着上一个答案,您可以像这样强制使用斜杠:
Path.GetDirectoryName(m_logsDir + "\");
丑陋,但似乎可行-末尾是0还是1。 GetDirectoryName将双斜杠视为单斜杠。