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 \"?

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

Andrew Barber
sumber
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")); 
penjelajah
sumber
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.

Jon Hanna
sumber
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

Kobie Williams
sumber
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;
kevinwaite
sumber
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));
        }
    }
}
Karam
sumber