无论尾部斜杠如何,都从完整目录路径获取目录名称

时间:2015-05-22 14:39:04

标签: c# .net

我需要从其路径中获取目录名称,而不管是否有任何尾部反斜杠。例如,用户可以输入以下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)是否真的是一个目录;如果是,则返回它,如果没有(日志也可能是文件),则返回父目录。如果需要处理实际的文件系统而不是分析字符串本身。

有没有标准功能呢?

5 个答案:

答案 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将双斜杠视为单斜杠。