Dapatkan (bagian terakhir) nama direktori saat ini di C #


158

Saya perlu mendapatkan bagian terakhir dari direktori saat ini, misalnya dari /Users/smcho/filegen_from_directory/AIRPassthrough, saya perlu mendapatkannya AIRPassthrough.

Dengan python, saya bisa mendapatkannya dengan kode ini.

import os.path

path = "/Users/smcho/filegen_from_directory/AIRPassthrough"
print os.path.split(path)[-1]

Atau

print os.path.basename(path)

Bagaimana saya bisa melakukan hal yang sama dengan C #?

TAMBAH

Dengan bantuan dari para penjawab, saya menemukan apa yang saya butuhkan.

using System.Linq;
string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName  = fullPath.Split(Path.DirectorySeparatorChar).Last();

atau

string fullPath = Path.GetFullPath(fullPath).TrimEnd(Path.DirectorySeparatorChar);
string projectName = Path.GetFileName(fullPath);


1
Dengan python, Anda sebaiknya melakukannya os.path.basename(path).
ReneSac

Jawaban:


132

Anda sedang mencari Path.GetFileName.
Perhatikan bahwa ini tidak akan berfungsi jika path berakhiran a \.


3
@anti: Salah; Saya mencobanya. String adalah string. Rekatkan Path.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")ke LINQPad jika Anda tidak percaya kepada saya.
SLaks

@ Kebenaran Tidak, ini akan mengembalikan nama direktori, tetapi mungkin tidak persis apa pertanyaannya.
Jakob Möllås

@ Jakob: Diberi judul, saya pikir inilah pertanyaannya.
Lemparan

3
@Light: Ini tidak bekerja; Cobalah. The Pathkelas menangani kedua pemisah.
SLaks

31
Untuk mendapatkan pekerjaan ini dengan direktori diambil oleh Directory.GetDirectories gunakan: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad

185

Kamu bisa mencoba:

var path = @"/Users/smcho/filegen_from_directory/AIRPassthrough/";
var dirName = new DirectoryInfo(path).Name;

20
Saya suka ini lebih baik daripada jawaban yang dipilih. (Ab) menggunakan GetFileName secara semantik salah karena itu adalah direktori yang Anda coba ambil. Juga, untuk membuat GetFileName deterministik berarti Anda harus memperhitungkan kemungkinan garis miring ke belakang atau garis miring terbalik, dan memotongnya, yang jelek.
Simon Brangwin

var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)). Nama // lebih baik
kernowcode

@kernowcode Saya percaya itu akan mengembalikan "filegen_from_directory" alih-alih '' AIRPassthrough "seperti yang diminta oleh OP.
codybartfast

1
@SimonBrangwin Saya pikir semuanya adalah file di Linux :)
Razor

12

Nah, untuk menjawab dengan tepat judul pertanyaan Anda :-)

var lastPartOfCurrentDirectoryName = 
   Path.GetFileName(Environment.CurrentDirectory);

12

Ini adalah jawaban yang sedikit berbeda, tergantung pada apa yang Anda miliki. Jika Anda memiliki daftar file dan perlu mendapatkan nama direktori terakhir tempat file tersebut berada, Anda dapat melakukan ini:

string path = "/attachments/1828_clientid/2938_parentid/somefiles.docx";
string result = new DirectoryInfo(path).Parent.Name;

Ini akan mengembalikan "2938_parentid"


8

daripada menggunakan tanda '/' untuk panggilan terpecah, lebih baik menggunakan Path.DirectorySeparatorChar:

seperti itu:

path.split(Path.DirectorySeparatorChar).Last() 

1
Satu hal yang saya tidak suka tentang menggunakan solusi ini adalah bahwa ia membuat asumsi dari mana string itu berasal. Bagaimana jika mereka membaca log * nix pada Sistem Windows? Maka karakter yang salah akan digunakan dan Anda akan berakhir dengan seluruh jalur, daripada efek yang dimaksudkan. Hanya 2 sen saya.
Bob G

Saya setuju dengan Anda dalam hal ini. OP mengatakan 'bagian terakhir dari direktori saat ini' jadi untuk itu, ini tidak masalah.
Muad'Dib

6
var lastFolderName = Path.GetFileName(
    path.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar));

Ini berfungsi jika jalan kebetulan mengandung pemisah garis miring atau pemisah garis miring terbalik.


1
Sepertinya string.TrimEnd () menerima beberapa karakter, jadi tidak perlu menggunakan beberapa panggilan. msdn.microsoft.com/en-us/library/…
Kyle Delaney

1
@KyleDelaney begitu! Jawaban disesuaikan.
Holf

1
Ini adalah array params, jadi .TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)berfungsi juga.
Kyle Delaney

1
Lokasi yang diterapkan dari .TrimEnd () salah. Itu harus diterapkan ke path , bukan Path.GetFileName . Lihat jawaban dari @Fatlad
Tony

2

Coba ini:

String newString = "";
Sting oldString = "/Users/smcho/filegen_from_directory/AIRPassthrough";

int indexOfLastSlash = oldString.LastIndexOf('/', 0, oldString.length());

newString = oldString.subString(indexOfLastSlash, oldString.length());

Kode mungkin mati (saya belum mengujinya) tetapi idenya harus bekerja


1

Ini berfungsi baik-baik saja dengan saya :)

Path.GetFileName(path.TrimEnd('\\')


0

Anda juga dapat menggunakan kelas Uri.

new Uri("file:///Users/smcho/filegen_from_directory/AIRPassthrough").Segments.Last()

Anda mungkin lebih suka menggunakan kelas ini jika Anda ingin mendapatkan segmen lain, atau jika Anda ingin melakukan hal yang sama dengan alamat web.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.