รับชื่อโฟลเดอร์จากเส้นทางไฟล์แบบเต็ม


116

ฉันจะรับชื่อโฟลเดอร์จากเส้นทางแบบเต็มของแอปพลิเคชันได้อย่างไร

นี่คือเส้นทางไฟล์ด้านล่าง

c:\projects\root\wsdlproj\devlop\beta2\text

นี่คือ "ข้อความ" คือชื่อโฟลเดอร์

ฉันจะรับชื่อโฟลเดอร์นั้นจากเส้นทางนี้ได้อย่างไร

คำตอบ:


205

ดูDirectoryInfo.Name :

string dirName = new DirectoryInfo(@"c:\projects\roott\wsdlproj\devlop\beta2\text").Name;

สิ่งนี้ไม่ต้องการให้โฟลเดอร์นั้นมีอยู่จริงในระบบไฟล์ (ชื่อโฟลเดอร์จะยังคงเป็น "ข้อความ" สำหรับเส้นทางไฟล์แบบเต็มนั้นหากโฟลเดอร์ "c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text" ไม่ ( ปัจจุบัน) อยู่ในระบบไฟล์)?
Peter Mortensen

@PeterMortensen เลขที่ ฉันเพิ่งทดสอบสิ่งนี้และวิธีการส่งคืนชื่อของโฟลเดอร์ระดับต่ำสุดจากสตริงแม้ว่าจะไม่มีเส้นทางโฟลเดอร์ก็ตาม
vbguyny

1
ขอบคุณคำตอบที่ดี แต่ฉันงงเล็กน้อยที่ System.IO.Directory ไม่รองรับการทำงานดังกล่าว
anhoppe

1
@anhoppe - ฉันเห็นด้วย อีกทางเลือกหนึ่งที่ฉันเห็นคือ Path.GetDirectoryName msdn.microsoft.com/en-us/library/… - แต่จะไม่สามารถทดสอบได้จนกว่าจะถึงวันพรุ่งนี้
Don Cheadle

30

ฉันคิดว่าคุณต้องการรับชื่อโฟลเดอร์หลักจากเส้นทางไฟล์ เป็นเรื่องง่ายที่จะได้รับ วิธีหนึ่งคือสร้างFileInfoวัตถุประเภทและใช้Directoryคุณสมบัติ

ตัวอย่าง:

FileInfo fInfo = new FileInfo("c:\projects\roott\wsdlproj\devlop\beta2\text\abc.txt");

String dirName = fInfo.Directory.Name;

16

ลองทำตามนี้

var myFolderName = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
var result = Path.GetFileName(myFolderName);

หากคุณมีชื่อไฟล์เป็นสตริงมันจะส่งคืนชื่อไฟล์ด้วย
swissben

1
ในกรณีนี้ข้อความคือชื่อไฟล์ (ไม่มีนามสกุล) ฉันคิดว่านั่นคือสิ่งที่ OP หลังจากนั้น หากเป็นโฟลเดอร์หรือชื่อไฟล์ก็ไม่สำคัญ หากสตริงไม่มีชื่อไฟล์รหัสนี้จะให้สิ่งที่เขาเป็น
ØyvindBråthen

4
เว้นแต่เส้นทางจะลงท้ายด้วย \ like this:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes

1
สิ่งนี้ใช้ไม่ได้กับโฟลเดอร์ ฉันได้รับสตริงว่างเปล่า ต้องมีไฟล์อยู่
BraveNewMath

3
วิธีนี้ใช้ได้ดีหากเส้นทางโฟลเดอร์ไม่มีเครื่องหมายแบ็กสแลชต่อท้าย (เช่นเส้นทางโฟลเดอร์ที่ส่งคืนจากPath.GetDirectoryName () ) ชื่อของฟังก์ชัน GetFileName () นั้นทำให้เข้าใจผิดได้เล็กน้อย
Peter Mortensen

9

คุณสามารถใช้สิ่งนี้:

string path = @"c:\projects\roott\wsdlproj\devlop\beta2\text";
string lastDirectory = path.Split(new char[] { System.IO.Path.DirectorySeparatorChar }, StringSplitOptions.RemoveEmptyEntries).Last();

จะเกิดอะไรขึ้นถ้าเส้นทางมีลักษณะเช่นนี้: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \" ดังนั้นด้วย DirectorySeparatorChar เพิ่มเติม
Alex Pacurar

1
@ Alex - ฉันแก้ไขโค้ดของฉันเพื่อให้มันใช้งานได้กับพา ธ ประเภทนั้นเช่นกัน StringSplitOptions.RemoveEmptyEntriesเคล็ดลับไม่
Kristof Claes

ตามmsdn.microsoft.com/en-us/library/… FileInfo สามารถโยนข้อยกเว้นได้หากไม่ได้รับอนุญาตที่จำเป็น
Daniel B

5

เพียงแค่ใช้ Path.GetFileName

ที่นี่ - แยกชื่อโฟลเดอร์จากเส้นทางแบบเต็มของโฟลเดอร์:

string folderName = Path.GetFileName(@"c:\projects\root\wsdlproj\devlop\beta2\text");//Return "text"

นี่คือบางส่วนพิเศษ - แยกชื่อโฟลเดอร์จากเส้นทางแบบเต็มของไฟล์:

string folderName = Path.GetFileName(Path.GetDirectoryName(@"c:\projects\root\wsdlproj\devlop\beta2\text\GTA.exe"));//Return "text"

3

ฉันคิดว่าไม่มีวิธีใดนอกจากเข้าไปในระบบไฟล์เพื่อดูว่า text.txt เป็นไดเร็กทอรีหรือแค่ไฟล์ หากคุณต้องการอะไรง่ายๆคุณสามารถใช้:

s.Substring(s.LastIndexOf(@"\"));

1
เพื่อหลีกเลี่ยงการทับที่ด้านหน้าของสตริง: s.Substring (s.LastIndexOf (@ "\") + 1);
David Yates

2

ในกรณีนี้ไฟล์ที่คุณต้องการรับจะถูกเก็บไว้ในตัวแปร strpath:

string strPath = Server.MapPath(Request.ApplicationPath) + "/contents/member/" + strFileName;

2

นี่คือวิธีอื่นที่ใช้ได้ผลสำหรับฉันโดยไม่ต้องสร้างวัตถุ DirectoryInfo ประเด็นสำคัญคือใช้GetFileName()งานได้เมื่อไม่มีเครื่องหมายทับในเส้นทาง

var name = Path.GetFileName(path.TrimEnd(Path.DirectorySeparatorChar));

ตัวอย่าง:

var list = Directory.EnumerateDirectories(path, "*")
        .Select(p => new
        {
            id = "id_" + p.GetHashCode().ToString("x"),
            text = Path.GetFileName(p.TrimEnd(Path.DirectorySeparatorChar)),
            icon = "fa fa-folder",
            children = true
        })
        .Distinct()
        .OrderBy(p => p.text);

1

สิ่งนี้สามารถทำได้เช่นกัน

var directoryName = System.IO.Path.GetFileName(@"c:\projects\roott\wsdlproj\devlop\beta2\text");

สิ่งนี้จะส่งคืนสตริงว่าง
disklosr

@disklosr - เพิ่งทดสอบกับ ScriptCs และส่งกลับ 'text'
Steve Cooper

2
วิธีนี้ใช้ได้ดีหากเส้นทางโฟลเดอร์ไม่มีเครื่องหมายแบ็กสแลชต่อท้าย (เช่นเส้นทางโฟลเดอร์ที่ส่งคืนจากPath.GetDirectoryName () ) ชื่อของฟังก์ชัน GetFileName () นั้นทำให้เข้าใจผิดได้เล็กน้อย
Peter Mortensen

0

ขึ้นอยู่กับคำตอบก่อนหน้านี้ (แต่แก้ไขแล้ว)

using static System.IO.Path;

var dir = GetFileName(path?.TrimEnd(DirectorySeparatorChar, AltDirectorySeparatorChar));

คำอธิบายGetFileNameจากแหล่งที่มา. NET :

ส่งคืนชื่อและส่วนขยายของเส้นทางที่กำหนด สตริงผลลัพธ์ประกอบด้วยอักขระของพา ธ ที่ตามหลังเครื่องหมายทับขวา ("\"), สแลช ("/") หรือโคลอน (":") อักขระในพา ธ สตริงผลลัพธ์คือเส้นทางทั้งหมดหากพา ธ ไม่มีแบ็กสแลชหลังจากลบอักขระเครื่องหมายทับเครื่องหมายทับหรือโคลอน สตริงผลลัพธ์เป็นโมฆะหากพา ธ เป็นโมฆะ


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