Dosya adı içeren yoldan dosya adı olmadan tam yolu alma


200

System.IO.PathBana sadece dosya yolunu veren bir şey var mı ?

Örneğin, string

@ "C: \ web sunucusu \ halka \ MyCompany \ yapılandırmaları \ promo.xml",

bana verecek bir BCL yöntemi var mı

"C: \ web sunucusu \ kamu \ MyCompany \ yapılandırmaları \"?



FWIW: Path'in "yolları" ele almasından "vazgeçtim" ve UNC (GetDirectoryName'i UNC yolunda kullanmaya çalışın) ve sözleşmelerle (örn. İzleyen /) daha iyi beklentiler ve tekdüzelik ile kendi yöntemlerimizi kullanıyoruz.
user2864740

Dosya veya dizin mevcut değilse, promo.xmlaynı adla bir dosya veya dizin belirleyip belirlemeyeceğinizi bilmenin bir yolu yoktur . Muhtemelen bu yüzden Path.GetDirectoryName()bu kadar basit uygulanır ve sadece son segmenti keser veya varsa eğik çizgiyi kaldırır.
Abel

Yanıtlar:


242

Path.GetDirectoryName()... ancak geçtiğiniz yolun bir dosya adı içerdiğini bilmeniz gerekir; bir dosya adı veya dizin adı olsun, son biti yoldan kaldırır (aslında hangisi olduğu hakkında hiçbir fikri yoktur).

Aramanız gerekip gerekmediğini görmek için önce test ederek File.Exists()ve / veya önce yolunuzda doğrulayabilirsinizDirectory.Exists()Path.GetDirectoryName


2
Aramaya gerek yok File.Exists(). Gerçekten de, dizin adını bulma nedeninizin zaten mevcut değilse oluşturmaktır.
Jon Hanna

3
Örneği açık bir şekilde dosya adına sahip bir yolu not ediyor. Test ettiği yolların paterni bu ise ve bu yollar mevcut dosyaları temsil ediyorsa, File.Exists () 'in kontrol edilmesi kesinlikle yararlı olacaktır, kabul etmeyecek misiniz? Durum başka türlü olabileceğinden, elbette, Dosya ve / veya Dizin üzerindeki mevcut yöntemleri 'kullanabileceğini' öneriyordum; Açıkçası, durumu için uygun.
Andrew Barber

Evet, dosya adına sahip bir yol. Dosya adları önce geldiğinden, dosyanın var olduğunu gösteren hiçbir şey yoktur.
Jon Hanna

4
Söylediğim gibi; bu bir seçenektir ve yol hakkında bilinenlere bağlı olarak yardımcı olabilir. Ya da hiç gerekli olmayabilir. Ancak File.Exists () ve Directory.Exists () öğelerinin aynı yol üzerinde test edilmesi, var olan bir yolun bir dosya veya dizin olup olmadığını bilmenin hızlı ve kolay bir yoludur.
Andrew Barber

5
hızlı bir referans olarak, soru ile fazlalık içinde ve "açık" muamele, System.IObunun çalışması için dahil etmeniz gerekir .
cregox

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

2
Bu en iyisi. using System.IO;Yol yöntemlerini kullanmayı unutmayın
Sözdizimi Hatası

Bunun sondaki bir eğik çizgi içermediğini unutmayın (bir tane eklemek önemsizdir)
Mingwei Samuel

51

Path.GetDirectoryName()dizin adını döndürür, böylece istediğiniz için (sondaki ters solidus karakteriyle) arayabilirsiniz 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 \ yapılandırmalar


6
Bu cevabı geliştirmek için lütfen yukarıdaki kodun soruyu nasıl cevapladığı hakkında bazı bilgiler verin.
Eric Hauenstein

1
Path.GetFullPath, dosya adı olmadan tam yolu döndürür.
Kobie Williams

Çıktıyı göstermenin yararlı olacağını, son iki satır arasındaki farkın ne olduğunu bilmiyorum.
gakera

çıktı -> c: \ webserver \ public \ myCompany \
configs olur

5

'GetParent ()' gösterildiği gibi kullanın, güzel çalışıyor. Gerektiğinde hata denetimi ekleyin.

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

4

Bunu kullandım ve iyi çalışıyor:

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));
        }
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.