Dapatkan path lengkap tanpa nama file dari path yang menyertakan nama file


198

Apakah ada sesuatu yang dibangun System.IO.Pathyang memberi saya hanya filepath?

Misalnya, jika saya punya string

@ "c: \ webserver \ public \ myCompany \ configs \ promo.xml",

apakah ada metode BCL yang akan memberi saya

"c: \ webserver \ public \ myCompany \ configs \"?



FWIW: Saya sudah "menyerah" pada penanganan Path atas "jalur" dan kami menggunakan metode kami sendiri dengan harapan dan keseragaman yang lebih baik dengan UNC (coba gunakan GetDirectoryName pada jalur UNC) dan konvensi (mis. Trailing /).
user2864740

Kecuali file atau direktori ada, tidak ada cara untuk mengetahui apakah promo.xmlmenunjuk file atau direktori dengan nama yang sama. Yang mungkin mengapa Path.GetDirectoryName()diimplementasikan sangat sederhana dan hanya memotong segmen terakhir, atau menghapus garis miring jika ada.
Abel

Jawaban:


241

Path.GetDirectoryName()... tetapi Anda perlu tahu bahwa jalur yang Anda lewati memang mengandung nama file; itu hanya menghapus bit terakhir dari path, apakah itu nama file atau nama direktori (sebenarnya tidak tahu yang mana).

Anda dapat memvalidasi terlebih dahulu dengan menguji File.Exists()dan / atau Directory.Exists()di jalur Anda terlebih dahulu untuk melihat apakah Anda perlu meneleponPath.GetDirectoryName


2
Tidak perlu menelepon File.Exists(). Memang, ini agak kontra-produktif dalam kasus di mana alasan Anda untuk menemukan nama direktori adalah untuk membuatnya jika belum ada.
Jon Hanna

3
Contohnya secara eksplisit mencatat jalur dengan nama file. Jika itu adalah pola jalur yang dia uji, dan jika jalur tersebut mewakili file yang ada, memeriksa File.Exists () pasti akan berguna, apakah Anda tidak setuju? Karena situasinya bisa sebaliknya, tentu saja, saya hanya menyarankan dia 'bisa' menggunakan metode yang ada pada File dan / atau Direktori; jelas, sesuai untuk situasinya.
Andrew Barber

Ya, jalur dengan nama file. Tidak ada artinya menunjukkan file ada, karena nama file yang lebih dulu.
Jon Hanna

4
Seperti yang saya katakan; ini merupakan opsi dan mungkin membantu tergantung pada apa yang diketahui tentang jalan. Atau mungkin tidak perlu sama sekali. Tetapi menguji File.Exists () dan Directory.Exists () di jalur yang sama adalah cara cepat dan mudah untuk mengetahui apakah jalur, yang ada, adalah file atau direktori.
Andrew Barber

5
sebagai referensi cepat, redundansi dengan pertanyaan, dan suguhan "jelas", Anda harus memasukkan System.IOini agar berfungsi.
cregox

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

2
Ini yang terbaik. Ingatlah using System.IO;untuk menggunakan metode jalur
Sintaks Kesalahan

Perhatikan bahwa ini tidak termasuk garis miring (sepele untuk ditambahkan)
Mingwei Samuel

51

Path.GetDirectoryName()mengembalikan nama direktori, jadi untuk apa yang Anda inginkan (dengan karakter trailing reverse solidus) Anda dapat memanggil 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
Harap berikan beberapa informasi tentang bagaimana kode di atas menjawab pertanyaan untuk meningkatkan jawaban ini.
Eric Hauenstein

1
Path.GetFullPath mengembalikan jalur penuh tanpa nama file.
Kobie Williams

menunjukkan output akan sangat membantu, saya tidak tahu apa perbedaan antara dua baris terakhir.
gakera

output akan -> c: \ webserver \ public \ myCompany \ configs
Kobie Williams

5

Gunakan 'GetParent ()' seperti yang ditunjukkan, berfungsi dengan baik. Tambahkan pengecekan kesalahan yang Anda butuhkan.

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

4

Saya menggunakan ini dan berfungsi dengan baik:

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));
        }
    }
}
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.