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


200

มีอะไรในตัวSystem.IO.Pathที่ทำให้ฉันเป็นเพียงพา ธ

ตัวอย่างเช่นถ้าฉันมี string

@ "C: \ เว็บเซิร์ฟเวอร์ \ ประชาชน \ myCompany \ configs \ promo.xml"

มีวิธี BCL ใดบ้างที่จะให้ฉัน

"C: \ เว็บเซิร์ฟเวอร์ \ ประชาชน \ myCompany \ configs \"?



FWIW: ฉัน "ยอมแพ้" ในการจัดการ "เส้นทาง" ของ Path และเราใช้วิธีการของเราเองโดยมีความคาดหวังและความเท่าเทียมกับ UNC ที่ดีกว่า (ลองใช้ GetDirectoryName บนเส้นทาง UNC) และอนุสัญญา (เช่น trailing /)
2864740

หากไม่มีไฟล์หรือไดเรกทอรีอยู่จะไม่มีวิธีรู้ว่าpromo.xmlออกแบบไฟล์หรือไดเรกทอรีด้วยชื่อเดียวกัน ซึ่งอาจเป็นสาเหตุที่ทำให้Path.GetDirectoryName()มีการใช้งานง่ายและตัดส่วนสุดท้ายหรือลบเครื่องหมายสแลชต่อท้ายหากมี
Abel

คำตอบ:


242

Path.GetDirectoryName()... แต่คุณต้องรู้ว่าเส้นทางที่คุณส่งไปนั้นมีชื่อไฟล์อยู่ มันจะลบบิตสุดท้ายออกจากเส้นทางไม่ว่าจะเป็นชื่อไฟล์หรือชื่อไดเรกทอรี (อันที่จริงแล้วมันไม่มีความคิดใด ๆ )

คุณสามารถตรวจสอบก่อนโดยการทดสอบFile.Exists()และ / หรือDirectory.Exists()บนเส้นทางของคุณก่อนเพื่อดูว่าคุณจำเป็นต้องโทรPath.GetDirectoryName


2
File.Exists()ไม่จำเป็นต้องโทรไม่ได้ ที่จริงแล้วมันค่อนข้างต่อต้านในกรณีที่เหตุผลของคุณสำหรับการค้นหาชื่อไดเรกทอรีคือการสร้างมันถ้ามันไม่ได้อยู่
Jon Hanna

3
ตัวอย่างของเขาบันทึกเส้นทางที่มีชื่อไฟล์อย่างชัดเจน หากนั่นคือรูปแบบของพา ธ ที่เขากำลังทดสอบและหากพา ธ เหล่านั้นเป็นตัวแทนของไฟล์ที่มีอยู่การตรวจสอบ File.Exists () จะเป็นประโยชน์แน่นอนคุณจะไม่เห็นด้วยหรือไม่ เนื่องจากสถานการณ์อาจเป็นอย่างอื่นแน่นอนฉันแค่แนะนำให้เขา 'สามารถ' ใช้วิธีการที่มีอยู่ในไฟล์และ / หรือไดเรกทอรี; เห็นได้ชัดว่าเหมาะสมกับสถานการณ์ของเขา
Andrew Barber

ใช่เส้นทางที่มีชื่อไฟล์ ไม่มีสิ่งใดที่บ่งบอกว่ามีไฟล์อยู่เนื่องจากชื่อไฟล์มาก่อน
Jon Hanna

4
ที่ผมกล่าวว่า; เป็นตัวเลือกและอาจช่วยได้ขึ้นอยู่กับสิ่งที่ทราบเกี่ยวกับเส้นทาง หรืออาจไม่จำเป็นเลย แต่การทดสอบ File.Exists () และ Directory.Exists () บนเส้นทางเดียวกันนั้นเป็นวิธีที่รวดเร็วและง่ายดายในการทราบว่าเส้นทางที่มีอยู่นั้นเป็นไฟล์หรือไดเรกทอรี
Andrew Barber

5
เพื่อเป็นการอ้างอิงอย่างรวดเร็วในการทำซ้ำซ้อนกับคำถามและการปฏิบัติที่ "ชัดเจน" คุณจะต้องรวมSystem.IOการทำงานนี้ไว้ด้วย
cregox

71
Console.WriteLine(Path.GetDirectoryName(@"C:\hello\my\dear\world.hm")); 

2
นี่คือสิ่งที่ดีที่สุด. อย่าลืมusing System.IO;ใช้วิธีการเส้นทาง
ข้อผิดพลาดของไวยากรณ์

โปรดทราบว่านี่ไม่รวมเครื่องหมายสแลช (เล็กน้อยเพื่อเพิ่ม)
Mingwei Samuel

51

Path.GetDirectoryName()ส่งคืนชื่อไดเรกทอรีดังนั้นสิ่งที่คุณต้องการ (ด้วยอักขระโซลิดย้อนกลับแบบย้อนกลับ) ที่คุณสามารถโทรPath.GetDirectoryName(filePath) + Path.DirectorySeparatorCharได้


12
    string fileAndPath = @"c:\webserver\public\myCompany\configs\promo.xml";

    string currentDirectory = Path.GetDirectoryName(fileAndPath);

    string fullPathOnly = Path.GetFullPath(currentDirectory);

currentDirectory: c: \ webserver \ public \ myCompany \ configs

fullPathOnly: c: \ webserver \ public \ myCompany \ configs


6
โปรดให้ข้อมูลเกี่ยวกับวิธีการที่รหัสข้างต้นตอบคำถามเพื่อปรับปรุงคำตอบนี้
Eric Hauenstein

1
Path.GetFullPath ส่งคืนพา ธ เต็มโดยไม่มีชื่อไฟล์
Kobie Williams

การแสดงผลลัพธ์จะเป็นประโยชน์ฉันไม่ทราบเลยว่าความแตกต่างระหว่างสองบรรทัดสุดท้ายคืออะไร
gakera

ผลลัพธ์จะเป็น -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams

5

ใช้ 'GetParent ()' ตามที่แสดงทำงานได้ดี เพิ่มการตรวจสอบข้อผิดพลาดตามที่คุณต้องการ

var fn = openFileDialogSapTable.FileName;
var currentPath = Path.GetFullPath( fn );
currentPath = Directory.GetParent(currentPath).FullName;

4

ฉันใช้มันและมันทำงานได้ดี:

string[] filePaths = Directory.GetFiles(Path.GetDirectoryName(dialog.FileName));

foreach (string file in filePaths)
{   
    if (comboBox1.SelectedItem.ToString() == "")
    {
        if (file.Contains("c"))
        {
            comboBox2.Items.Add(Path.GetFileName(file));
        }
    }
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.