Mendapatkan nama folder dari jalur

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

Benda atau metode apa yang bisa saya gunakan yang akan memberi saya hasil folder2?

Ash Burlaczenko
sumber
5
Apakah Anda menginginkan nama folder terakhir jadi jika Anda memiliki C: \ folder1 \ folder2 \ folder3 \ file.txt, Anda ingin "folder3"?
Steve Danner

Jawaban:

335

Saya mungkin akan menggunakan sesuatu seperti:

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

Panggilan dalam ke GetDirectoryNameakan mengembalikan path lengkap, sedangkan panggilan luar ke GetFileName()akan mengembalikan komponen path terakhir - yang akan menjadi nama folder.

Pendekatan ini berfungsi apakah jalan benar-benar ada atau tidak. Pendekatan ini, bagaimanapun, bergantung pada jalur yang awalnya berakhir dengan nama file. Jika tidak diketahui apakah jalur berakhir dengan nama file atau nama folder - maka mengharuskan Anda memeriksa jalur sebenarnya untuk melihat apakah file / folder ada di lokasi terlebih dahulu. Dalam hal ini, jawaban Dan Dimitru mungkin lebih tepat.

LBushkin
sumber
133
Solusi lain: kembalikan DirectoryInfo (fullPath) baru. Nama;
Davide Icardi
1
Solusi dari Davide Icardi bekerja lebih baik untuk saya karena saya memiliki jalur relatif. Terima kasih.
akatran
4
@DavideIcardi Komentar Anda benar-benar harus menjadi jawaban, itu sangat berharga.
Ondrej Janacek
3
Ini tidak berfungsi ketika path tidak menyertakan file (path ke direktori), sedangkan solusi @DavideIcardi tidak.
Aage
6
PERINGATAN: solusi ini salah! Untuk "C: / bin / log" ia mengembalikan "bin". Gunakan return DirectoryInfo (fullPath) baru. Nama; sebagai gantinya.
Chris W
36

Coba ini:

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

Sederhana & bersih. Hanya menggunakan System.IO.FileSystem- berfungsi seperti pesona:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;
susieloo_
sumber
3
folder dalam hal ini akan menjadi file.txt, dan tidakfolder2
TJ Rockefeller
13

DirectoryInfo melakukan tugas untuk menghapus nama direktori

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

Saya menggunakan potongan kode ini untuk mendapatkan direktori untuk jalur ketika tidak ada nama file di jalur:

misalnya "c: \ tmp \ test \ visual";

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

Keluaran:

visual

Mario
sumber
Anda bisa melakukan Path.GetFileName (dir) dan itu akan mengembalikan nama folder dengan baik.
jrich523
3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();
Shawn
sumber
2

Penting juga untuk dicatat bahwa saat mendapatkan daftar nama direktori dalam satu lingkaran, DirectoryInfokelas akan diinisialisasi satu kali sehingga hanya memungkinkan panggilan pertama kali. Untuk melewati batasan ini, pastikan Anda menggunakan variabel dalam loop Anda untuk menyimpan nama direktori apa pun.

Sebagai contoh, kode sampel ini loop melalui daftar direktori dalam direktori induk sembari menambahkan setiap nama direktori yang ditemukan di dalam Daftar tipe string:

[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
Willy Kimura
sumber
1

Kode di bawah ini membantu untuk mendapatkan nama folder saja

 item ObservableCollection publik = new ObservableCollection ();

   mencoba
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (string s di folderPaths)
                {
                    items.Add (new gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), folderpath = s});

                }

            }
            catch (Pengecualian a)
            {

            }
  gridItems kelas publik
    {
        foldername string publik {get; set; }
        folderpath public string {get; set; }
    }
Joee
sumber
0

Ini jelek tapi menghindari alokasi:

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;
}
Johan Larsson
sumber