从路径获取文件夹名称


Answers:


334

我可能会使用类似:

string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );

内部调用GetDirectoryName将返回完整路径,而外部调用GetFileName()将返回最后一个路径部分-这将是文件夹名称。

无论路径是否实际存在,此方法都有效。但是,这种方法确实依赖于最初以文件名结尾的路径。如果不知道路径是以文件名还是文件夹名结尾-那么它要求您检查实际路径以首先查看该位置是否存在文件/文件夹。在这种情况下,Dan Dimitru的答案可能更合适。


133
另一种解决方案:返回new DirectoryInfo(fullPath).Name;
Davide Icardi 2012年

1
Davide Icardi的解决方案对我来说效果更好,因为我有相对的方法。谢谢。
akatran 2014年

4
@DavideIcardi您的意见确实应该是一个答案,这是值得的。
Ondrej Janacek 2015年

3
当路径不包含文件(目录的路径)而@DavideIcardi解决方案包含路径时,此方法将不起作用。
Aage

6
警告:此解决方案是错误的!对于“ C:/ bin / logs”,它返回“ bin”。使用return new DirectoryInfo(fullPath).Name; 代替。
Zbigniew Wiadro '18年

36

试试这个:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;

23

简单干净。仅使用System.IO.FileSystem-像魅力一样工作:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;

3
这种情况下的文件夹为file.txt,而不是folder2
TJ Rockefeller

13

DirectoryInfo进行剥离目录名称的工作

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32

7

当路径中没有文件名时,我使用以下代码片段获取路径的目录:

例如“ c:\ tmp \ test \ visual”;

string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));

输出:

视觉的


您可以只执行Path.GetFileName(dir),它将返回文件夹名称。
jrich523 2014年

3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();

2

同样重要的是要注意,在循环中DirectoryInfo获取目录名称列表时,该类将初始化一次,因此仅允许首次调用。为了绕过此限制,请确保在循环中使用变量来存储任何单个目录的名称。

例如,此示例代码循环遍历任何父目录中的目录列表,同时将找到的每个目录名添加到字符串类型的列表中:

[C#]

string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();

foreach (var directory in parentDirectory)
{
    // Notice I've created a DirectoryInfo variable.
    DirectoryInfo dirInfo = new DirectoryInfo(directory);

    // And likewise a name variable for storing the name.
    // If this is not added, only the first directory will
    // be captured in the loop; the rest won't.
    string name = dirInfo.Name;

    // Finally we add the directory name to our defined List.
    directories.Add(name);
}

[VB.NET]

Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()

For Each directory In parentDirectory

    ' Notice I've created a DirectoryInfo variable.
    Dim dirInfo As New DirectoryInfo(directory)

    ' And likewise a name variable for storing the name.
    ' If this is not added, only the first directory will
    ' be captured in the loop; the rest won't.
    Dim name As String = dirInfo.Name

    ' Finally we add the directory name to our defined List.
    directories.Add(name)

Next directory

1

下面的代码仅有助于获取文件夹名称

 公共ObservableCollection项目= new ObservableCollection();

   尝试
            {
                字符串[] folderPaths = Directory.GetDirectories(stemp);
                items.Clear();
                foreach(folderPaths中的字符串s)
                {
                    items.Add(new gridItems {foldername = s.Remove(0,s.LastIndexOf('\\')+ 1),folderpath = s});

                }

            }
            抓住(例外a)
            {

            }
  公共类gridItems
    {
        公用字符串foldername {get; 组; }
        公用字符串folderpath {get; 组; }
    }

0

这很丑陋,但避免分配:

private static string GetFolderName(string path)
{
    var end = -1;
    for (var i = path.Length; --i >= 0;)
    {
        var ch = path[i];
        if (ch == System.IO.Path.DirectorySeparatorChar ||
            ch == System.IO.Path.AltDirectorySeparatorChar ||
            ch == System.IO.Path.VolumeSeparatorChar)
        {
            if (end > 0)
            {
                return path.Substring(i + 1, end - i - 1);
            }

            end = i;
        }
    }

    if (end > 0)
    {
        return path.Substring(0, end);
    }

    return path;
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.