รับชื่อโฟลเดอร์จากพา ธ


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

วัตถุอะไรหรือวิธีการที่ฉันสามารถใช้ว่าจะให้ฉันเป็นผลมาจากfolder2?


5
คุณต้องการชื่อโฟลเดอร์สุดท้ายดังนั้นหากคุณมี C: \ folder1 \ folder2 \ folder3 \ file.txt คุณต้องการ "folder3" หรือไม่
Steve Danner

คำตอบ:


335

ฉันอาจจะใช้สิ่งที่ชอบ:

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

การเรียกภายในเพื่อGetDirectoryNameจะส่งคืนพา ธ เต็มในขณะที่การเรียกภายนอกGetFileName()จะส่งคืนคอมโพเนนต์พา ธ สุดท้าย - ซึ่งจะเป็นชื่อโฟลเดอร์

วิธีการนี้ใช้งานได้จริงหรือไม่ว่าเส้นทางนั้นมีอยู่จริงหรือไม่ อย่างไรก็ตามวิธีนี้จะขึ้นอยู่กับเส้นทางที่ลงท้ายด้วยชื่อไฟล์ หากไม่ทราบว่าเส้นทางสิ้นสุดในชื่อไฟล์หรือชื่อโฟลเดอร์ - คุณต้องตรวจสอบเส้นทางจริงเพื่อดูว่ามีไฟล์ / โฟลเดอร์อยู่ในตำแหน่งก่อนหรือไม่ ในกรณีนั้นคำตอบของแดนดิมิทรูอาจจะเหมาะสมกว่า


133
โซลูชันอื่น: ส่งคืน DirectoryInfo ใหม่ (fullPath) .Name;
Davide Icardi

1
โซลูชันจาก Davide Icardi ทำงานได้ดีขึ้นสำหรับฉันเพราะฉันมีเส้นทางญาติ ขอบคุณ
akatran

4
@DavideIcardi ความคิดเห็นของคุณควรเป็นคำตอบจริงๆมันคุ้มค่า
Ondrej Janacek

3
สิ่งนี้ไม่ทำงานเมื่อพา ธ ไม่มีไฟล์ (พา ธ ไปยังไดเร็กทอรี) ในขณะที่โซลูชัน @DavideIcardi ทำ
Aage

6
คำเตือน: วิธีนี้ไม่ถูกต้อง! สำหรับ "C: / bin / logs" จะส่งคืน "bin" ใช้การส่งคืน DirectoryInfo ใหม่ (fullPath) .Name แทน.
Chris W

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


2

สิ่งสำคัญคือต้องทราบว่าในขณะที่รับรายชื่อไดเรกทอรีในลูปDirectoryInfoคลาสจะได้รับการเตรียมใช้งานครั้งเดียวจึงอนุญาตเฉพาะการโทรครั้งแรกเท่านั้น เพื่อหลีกเลี่ยงข้อ จำกัด นี้ให้แน่ใจว่าคุณใช้ตัวแปรภายในลูปของคุณเพื่อจัดเก็บชื่อของไดเรกทอรีใด ๆ

ตัวอย่างเช่นโค้ดตัวอย่างนี้จะวนรายการไดเรกทอรีภายในไดเรกทอรีหลักใด ๆ ในขณะที่เพิ่มแต่ละชื่อไดเรกทอรีที่พบในรายการประเภทสตริง:

[ค#]

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 สาธารณะ = ใหม่ ObservableCollection ();

   ลอง
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (สตริง s ใน folderPaths)
                {
                    items.Add (gridItems ใหม่ {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            จับ (ยกเว้น a)
            {

            }
  รายการระดับสาธารณะ
    {
        ชื่อเล่นสตริงสาธารณะ {รับ; ตั้ง; }
        สตริงเส้นทางสาธารณะ {รับ; ตั้ง; }
    }

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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.