รับชื่อไดเรกทอรีปัจจุบัน (ส่วนสุดท้ายของ) ใน C #


158

ฉันต้องได้รับส่วนสุดท้ายของไดเรกทอรีปัจจุบันเช่นจากฉันต้องการที่จะได้รับ/Users/smcho/filegen_from_directory/AIRPassthroughAIRPassthrough

ด้วยไพ ธ อนฉันสามารถรับรหัสนี้ได้

import os.path

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

หรือ

print os.path.basename(path)

ฉันจะทำสิ่งเดียวกันกับ C # ได้อย่างไร

ADDED

ด้วยความช่วยเหลือจากผู้ตอบฉันพบสิ่งที่ฉันต้องการ

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

หรือ

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


1
os.path.basename(path)ในหลามคุณค่อนข้างควรจะทำอย่างไร
ReneSac

คำตอบ:


132

Path.GetFileNameคุณกำลังมองหา โปรดทราบว่านี้จะไม่ทำงานถ้าเส้นทางปลายใน
\


3
@anti: ผิด; ฉันลองแล้ว สตริงเป็นสตริง วางPath.GetFileName("/Users/smcho/filegen_from_directory/AIRPassthrough")ลงใน LINQPad ถ้าคุณไม่เชื่อฉัน
Slaks

@antisanity ไม่มันจะส่งคืนชื่อไดเรกทอรี แต่อาจไม่ตรงกับคำถามที่ถาม
Jakob Möllås

@ Jakob: จากชื่อฉันคิดว่านี่เป็นคำถามที่เกี่ยวกับ
Slaks

3
@Light: มันใช้งานได้ ลองมัน. Pathระดับจัดการทั้งตัวคั่น
Slaks

31
หากต้องการให้งานนี้มีการดึงข้อมูลไดเรกทอรีโดย Directory.GetDirectories ให้ใช้: string directoryName = Path.GetFileName (directory.TrimEnd (Path.DirectorySeparatorChar));
Fatlad

185

คุณสามารถลอง:

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

20
ฉันชอบสิ่งนี้ดีกว่าคำตอบที่เลือก (Ab) การใช้ GetFileName มีความหมายผิดเนื่องจากเป็นไดเรกทอรีที่คุณพยายามดึงข้อมูล นอกจากนี้ในการกำหนดค่า GetFileName หมายความว่าคุณต้องคำนึงถึงความเป็นไปได้ของเครื่องหมายสแลชหรือแบ็กสแลชต่อท้ายและตัดออกซึ่งน่าเกลียด
Simon Brangwin

var dirName = new DirectoryInfo (Path.GetDirectoryName (pathWithFilename)) ชื่อ // ดีกว่า
kernowcode

@ kernowcode ฉันเชื่อว่าจะส่งคืน "filegen_from_directory" แทนที่จะเป็น '' AIRPassthrough "ตามที่ร้องขอโดย OP
codybartfast

1
@SimonBrangwin ฉันคิดว่าทุกอย่างเป็นไฟล์ใน Linux :)
มีดโกน

12

เพื่อตอบคำถามของคุณอย่างแน่นอน :-)

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

12

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

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

สิ่งนี้จะส่งคืน "2938_parentid"


8

แทนที่จะใช้ '/' สำหรับการโทรเพื่อแยกควรใช้Path.DirectorySeparatorChar:

ชอบมาก:

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

1
สิ่งหนึ่งที่ฉันไม่ชอบเกี่ยวกับการใช้โซลูชันนี้คือมันทำให้ข้อสันนิษฐานที่มาจากสายอักขระ จะเกิดอะไรขึ้นถ้าพวกเขากำลังอ่าน * บันทึกห้ามบนระบบ Windows จากนั้นอักขระที่ไม่ถูกต้องจะถูกนำไปใช้และคุณจะจบลงด้วยเส้นทางทั้งหมดแทนที่จะใช้เอฟเฟกต์ที่ต้องการ แค่ 2 เซ็นต์ของฉัน
Bob G

ฉันเห็นด้วยกับคุณเกี่ยวกับเรื่องนี้ OP กล่าวว่า 'ส่วนสุดท้ายของไดเรกทอรีปัจจุบัน' ดังนั้นสิ่งนี้ก็ใช้ได้
Muad'Dib

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

สิ่งนี้จะทำงานหากเส้นทางเกิดขึ้นเพื่อให้มีตัวคั่นเครื่องหมายสแลชหรือตัวคั่นแบ็กสแลช


1
ดูเหมือนว่า string.TrimEnd () ยอมรับอักขระหลายตัวดังนั้นจึงไม่จำเป็นต้องใช้การโทรหลายครั้ง msdn.microsoft.com/en-us/library/…
Kyle Delaney

1
@ KyleDelaney มันเป็นอย่างนั้น! ปรับคำตอบแล้ว
Holf

1
มันเป็นอาร์เรย์แบบ Params ดังนั้น.TrimEnd(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar)ก็ใช้ได้เช่นกัน
Kyle Delaney

1
ตำแหน่งที่ใช้ของ. TrimEnd () ไม่ถูกต้อง มันควรจะนำไปใช้กับเส้นทางไม่Path.GetFileName ดูคำตอบจาก @Fatlad
Tony

2

ลองสิ่งนี้:

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

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

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

รหัสอาจถูกปิด (ฉันยังไม่ได้ทดสอบ) แต่แนวคิดควรใช้งานได้


1

มันใช้งานได้ดีอย่างสมบูรณ์แบบกับฉัน :)

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


0

คุณยังสามารถใช้คลาส Uri

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

คุณอาจต้องการใช้คลาสนี้หากคุณต้องการได้รับเซ็กเมนต์อื่นหรือถ้าคุณต้องการทำสิ่งเดียวกันด้วยที่อยู่เว็บ

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