Lấy tên thư mục từ một đường dẫn


186
string path = "C:/folder1/folder2/file.txt";

Những đối tượng hoặc phương pháp nào tôi có thể sử dụng sẽ cho tôi kết quả folder2?


5
Bạn có muốn tên thư mục cuối cùng vì vậy nếu bạn có C: \ thư mục1 \ thư mục2 \ thư mục3 \ file.txt, bạn muốn "thư mục3"?
Steve Danner

Câu trả lời:


333

Tôi có thể sẽ sử dụng một cái gì đó như:

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

Cuộc gọi bên trong GetDirectoryNamesẽ trả về đường dẫn đầy đủ, trong khi cuộc gọi bên ngoài tớiGetFileName() sẽ trả về thành phần đường dẫn cuối cùng - sẽ là tên thư mục.

Cách tiếp cận này hoạt động cho dù đường dẫn có thực sự tồn tại hay không. Tuy nhiên, cách tiếp cận này dựa vào đường dẫn ban đầu kết thúc bằng tên tệp. Nếu không biết đường dẫn kết thúc bằng tên tệp hay tên thư mục - thì nó yêu cầu bạn kiểm tra đường dẫn thực tế để xem liệu tệp / thư mục có tồn tại ở vị trí đó trước không. Trong trường hợp đó, câu trả lời của Dan Dimitru có thể phù hợp hơn.


133
Một giải pháp khác: trả về DirectoryInfo mới (fullPath) .Name;
Davide Icardi

1
Giải pháp từ Davide Icardi làm việc tốt hơn cho tôi vì tôi có những con đường tương đối. Cảm ơn.
akatran

4
@DavideIcardi Nhận xét của bạn thực sự nên là một câu trả lời, nó đáng giá.
Ondrej Janacek

3
Điều này không hoạt động khi đường dẫn không bao gồm một tệp (đường dẫn đến thư mục), trong khi giải pháp @DavideIcardi thì có.
Aage

6
CẢNH BÁO: giải pháp này là sai! Đối với "C: / bin / log", nó trả về "bin". Sử dụng trả về DirectoryInfo mới (fullPath) .Name; thay thế.
Zbigniew Wiadro

36

Thử cái này:

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

23

Đơn giản & sạch sẽ. Chỉ sử dụng System.IO.FileSystem- hoạt động như một bùa mê:

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

3
thư mục trong trường hợp này sẽ là file.txt, và khôngfolder2
TJ Rockefeller

13

DirectoryInfo thực hiện công việc để loại bỏ tên thư mục

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

7

Tôi đã sử dụng đoạn mã này để lấy thư mục cho một đường dẫn khi không có tên tệp trong đường dẫn:

ví dụ: "c: \ tmp \ test \ visual";

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

Đầu ra:

trực quan


Bạn chỉ có thể thực hiện Path.GetFileName (dir) và nó sẽ trả về tên thư mục tốt.
jrich523

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

2

Cũng cần lưu ý rằng trong khi nhận được danh sách các tên thư mục trong một vòng lặp, DirectoryInfo lớp sẽ được khởi tạo một lần do đó chỉ cho phép gọi lần đầu tiên. Để bỏ qua giới hạn này, đảm bảo bạn sử dụng các biến trong vòng lặp của mình để lưu trữ bất kỳ tên thư mục riêng lẻ nào.

Ví dụ, mã mẫu này lặp qua một danh sách các thư mục trong bất kỳ thư mục mẹ nào trong khi thêm từng tên thư mục tìm thấy bên trong Danh sách loại chuỗi:

[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

Mã dưới đây chỉ giúp lấy tên thư mục

 các mục ObservableCollection công khai = new ObservableCollection ();

   thử
            {
                chuỗi [] folderPaths = Directory.GetDirectories (stemp);
                các mặt hàng.Clear ();
                foreach (chuỗi s trong thư mụcPaths)
                {
                    mục.Add (new GridItems {Foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            bắt (Ngoại lệ a)
            {

            }
  lưới lớp học công cộng
    {
        tên người dùng chuỗi công khai {get; bộ; }
        chuỗi thư mục công cộng {get; bộ; }
    }

0

Điều này là xấu xí nhưng tránh phân bổ:

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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.