Klasör adını tam dosya yolundan alın


116

Klasör adını uygulamanın tam yolundan nasıl alırım?

Bu, aşağıdaki dosya yoludur,

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

Burada "metin" klasör adıdır.

Bu klasör adını bu yoldan nasıl alabilirim?

Yanıtlar:


205

DirectoryInfo.Name'e bakın :

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

Bu, klasörün gerçekten dosya sisteminde mevcut olmasını gerektirmez mi ( "c: \ projects \ root \ wsdlproj \ devlop \ beta2 \ text" klasörü yoksa klasör adı bu tam dosya yolu için hala "metin" olacaktır şu anda) dosya sisteminde var mı?
Peter Mortensen

@PeterMortensen, hayır. Bunu henüz test ettim ve yöntem, klasör yolu olmasa bile dizeden en düşük seviyeli klasörün adını döndürür.
vbguyny

1
Teşekkürler, harika cevap. Ancak System.IO.Directory'nin böyle bir işlemi desteklemediğine biraz şaşırdım.
anhoppe

1
@anhoppe - Katılıyorum. Gördüğüm başka bir seçenek de Path.GetDirectoryName msdn.microsoft.com/en-us/library/… - ancak yarına kadar test edemeyecek.
Don Cheadle

30

Dosya yolundan ana klasör adını almak istediğinizi düşünüyorum. Alması kolaydır. Bir yol, bir FileInfoyazı nesnesi oluşturmak ve onu kullanmaktır.Directory özelliğini .

Misal:

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

String dirName = fInfo.Directory.Name;

16

Bunu dene

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

dizede bir dosya
adınız

1
Bu durumda, metin (uzantısız) dosya adıdır. OP'nin peşinde olduğunun bu olduğunu düşündüm. Bir klasör veya dosya adı ise aslında önemli değil. Dize dosya adını içermiyorsa, bu kod ona peşinde olduğunu verecektir.
Øyvind Bråthen

4
Yollar bunun gibi bir \ ile bitmediği sürece:@"c:\projects\roott\wsdlproj\devlop\beta2\text\"
Kristof Claes

1
bu bir klasör için çalışmaz. Boş bir dize alıyorum. Mevcut bir dosya olmalı
BraveNewMath

3
Bu, klasör yolu sonda bir ters eğik çizgi içermiyorsa (örneğin, Path.GetDirectoryName () ' den döndürülen bir klasör yolu gibi) gayet iyi çalışır . Bu işlevin adı GetFileName (), biraz yanıltıcı olsa da.
Peter Mortensen

9

Bunu kullanabilirsin:

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

ya yol şöyle görünüyorsa: @ "c: \ projects \ roott \ wsdlproj \ devlop \ beta2 \ text \", yani ekstra DirectorySeparatorChar ile
Alex Pacurar

1
@Alex - Kodumu bu tür yollarla da çalışması için değiştirdim. StringSplitOptions.RemoveEmptyEntrieshile yapar.
Kristof Claes

Msdn.microsoft.com/en-us/library/… 'e göre , gerekli izin verilmediği takdirde FileInfo bir istisna atabilir.
Daniel B

5

Basitçe kullan Path.GetFileName

Burada - Klasör adını bir klasörün tam yolundan çıkarın:

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

İşte bazı ekstra - Klasör adını bir dosyanın tam yolundan çıkarın:

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

3

Text.txt'nin bir dizin mi yoksa sadece bir dosya mı olduğunu bulmak için dosya sistemine girmekten başka bir yol olmadığını düşündüm. Basit bir şey istiyorsanız, belki de kullanabilirsiniz:

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

1
Dizenin önünde eğik çizgiden kaçınmak için: s.Substring (s.LastIndexOf (@ "\") + 1);
David Yates

2

Bu durumda, almak istediğiniz dosya strpath değişkeninde saklanır:

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

2

İşte bir DirectoryInfo nesnesi oluşturmak zorunda kalmadan benim için çalışan alternatif bir yöntem. Kilit nokta, GetFileName()yolda eğik çizgi olmadığında çalışmasıdır.

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

Misal:

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

Bu da şu şekilde yapılabilir;

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

bu boş bir dize döndürecektir
disklosr

@disklosr - az önce ScriptC'lerle test edildi ve 'metin' döndürüyor
Steve Cooper

2
Bu, klasör yolu sonda bir ters eğik çizgi içermiyorsa (örneğin, Path.GetDirectoryName () ' den döndürülen bir klasör yolu gibi) gayet iyi çalışır . Bu işlevin adı GetFileName (), biraz yanıltıcı olsa da.
Peter Mortensen

0

Göre önceki cevaplar (ancak sabit)

using static System.IO.Path;

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

Açıklanması GetFileNamedan .NET kaynağı :

Verilen yolun adını ve uzantı kısımlarını döndürür. Sonuçta elde edilen dize, yolda son ters eğik çizgiyi ("\"), eğik çizgiyi ("/") veya iki nokta üst üste (":") karakterini izleyen yol karakterlerini içerir. Sondaki eğik çizgi, eğik çizgi veya iki nokta üst üste karakterleri kaldırıldıktan sonra yol ters eğik çizgi içermiyorsa, sonuçta elde edilen dize, yolun tamamıdır. Yol null ise ortaya çıkan dize null olur.


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.