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);
prosseek
sumber
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 \.

Slaks
sumber
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;
codybartfast
sumber
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);
Jakob Möllås
sumber
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"

ProVega
sumber
8

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

seperti itu:

path.split(Path.DirectorySeparatorChar).Last() 
Muad'Dib
sumber
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.

Serigala
sumber
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

Piala Stanley Phil
sumber
1

Ini berfungsi baik-baik saja dengan saya :)

Path.GetFileName(path.TrimEnd('\\')
Akshay
sumber
0

Anda dapat mencoba kode di bawah ini:

Path.GetFileName(userpath)

Code_Beginner
sumber
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.

Chris
sumber