Klasör adını bir yoldan alma


187
string path = "C:/folder1/folder2/file.txt";

Bunun sonucunda bana hangi nesneleri veya yöntemleri kullanabilirim folder2?


5
Son klasör adını mı istiyorsunuz, bu yüzden C: \ klasör1 \ klasör2 \ klasör3 \ dosya.txt'niz varsa, "klasör3" ü mü istiyorsunuz?
Steve Danner

Yanıtlar:


336

Muhtemelen şöyle bir şey kullanırdım:

string path = "C:/folder1/folder2/file.txt";
string lastFolderName = Path.GetFileName( Path.GetDirectoryName( path ) );

İç çağrı GetDirectoryNametam yolu döndürürken dış çağrı GetFileName()son yol bileşenini döndürür - klasör adı olacaktır.

Bu yaklaşım, yolun gerçekten var olup olmadığına bakılmaksızın çalışır. Ancak bu yaklaşım, başlangıçta bir dosya adıyla biten yola dayanır. Yolun bir dosya adı veya klasör adıyla bitip bitmediği bilinmiyorsa, önce konumda bir dosya / klasörün olup olmadığını görmek için gerçek yolu kontrol etmenizi gerektirir. Bu durumda, Dan Dimitru'nun cevabı daha uygun olabilir.


134
Başka bir çözüm: yeni DirectoryInfo (fullPath) döndürün.
Davide Icardi

1
Davide Icardi'nin çözümü benim için daha iyi çalıştı çünkü göreceli yollara sahiptim. Teşekkürler.
akatran

4
@DavideIcardi Yorumunuz gerçekten bir cevap olmalı, buna değer.
Ondrej Janacek

3
@DavideIcardi çözümü söz konusu olduğunda yol bir dosya (bir dizin yolu) içermediğinde bu çalışmaz.
Yaş

6
UYARI: bu çözüm yanlış! "C: / bin / logs" için "bin" döndürür. Return new DirectoryInfo (fullPath) kullanın. yerine.
Chris W

36

Bunu dene:

string filename = @"C:/folder1/folder2/file.txt";
string FolderName = new DirectoryInfo(System.IO.Path.GetDirectoryName(filename)).Name;

23

Basit ve temiz. Sadece kullanır System.IO.FileSystem- bir cazibe gibi çalışır:

string path = "C:/folder1/folder2/file.txt";
string folder = new DirectoryInfo(path).Name;

3
Bu durumda klasör olur file.txtve olmazfolder2
TJ Rockefeller

13

DirectoryInfo işi dizin adını çıkarmak için yapar

string my_path = @"C:\Windows\System32";
DirectoryInfo dir_info = new DirectoryInfo(my_path);
string directory = dir_info.Name;  // System32

7

Yolda hiçbir dosya adı olmadığında bir yolun dizinini almak için bu kod parçacığını kullandım:

örneğin "c: \ tmp \ test \ visual";

string dir = @"c:\tmp\test\visual";
Console.WriteLine(dir.Replace(Path.GetDirectoryName(dir) + Path.DirectorySeparatorChar, ""));

Çıktı:

görsel


Sadece Path.GetFileName (dir) yapabilirsiniz ve klasör adını gayet iyi döndürecektir.
jrich523

3
var fullPath = @"C:\folder1\folder2\file.txt";
var lastDirectory = Path.GetDirectoryName(fullPath).Split('\\').LastOrDefault();

2

Bir döngüdeki dizin adlarının bir listesini alırken, DirectoryInfosınıfın bir kez başlatıldığını ve böylece yalnızca ilk kez aramaya izin verildiğini de not etmek önemlidir . Bu sınırlamayı atlamak için, döngü içinde herhangi bir dizinin adını saklamak için değişkenleri kullandığınızdan emin olun.

Örneğin, bu örnek kod, bulunan her dizin adını bir dize türü Listesi içine eklerken, herhangi bir üst dizindeki dizinlerin bir listesini gözden geçirir:

[C #]

string[] parentDirectory = Directory.GetDirectories("/yourpath");
List<string> directories = new List<string>();

foreach (var directory in parentDirectory)
{
    // Notice I've created a DirectoryInfo variable.
    DirectoryInfo dirInfo = new DirectoryInfo(directory);

    // And likewise a name variable for storing the name.
    // If this is not added, only the first directory will
    // be captured in the loop; the rest won't.
    string name = dirInfo.Name;

    // Finally we add the directory name to our defined List.
    directories.Add(name);
}

[VB.NET]

Dim parentDirectory() As String = Directory.GetDirectories("/yourpath")
Dim directories As New List(Of String)()

For Each directory In parentDirectory

    ' Notice I've created a DirectoryInfo variable.
    Dim dirInfo As New DirectoryInfo(directory)

    ' And likewise a name variable for storing the name.
    ' If this is not added, only the first directory will
    ' be captured in the loop; the rest won't.
    Dim name As String = dirInfo.Name

    ' Finally we add the directory name to our defined List.
    directories.Add(name)

Next directory

1

Aşağıdaki kod yalnızca klasör adını almanıza yardımcı olur

 public ObservableCollection öğeleri = yeni ObservableCollection ();

   Deneyin
            {
                string [] folderPaths = Directory.GetDirectories (stemp);
                items.Clear ();
                foreach (folderPaths içindeki dize s)
                {
                    items.Add (yeni gridItems {foldername = s.Remove (0, s.LastIndexOf ('\\') + 1), klasöryolu = s});

                }

            }
            catch (İstisna a)
            {

            }
  genel sınıf gridItems
    {
        genel dize kat adı {get; Ayarlamak; }
        genel dize klasöryolu {get; Ayarlamak; }
    }

0

Bu çirkin ama tahsisleri önler:

private static string GetFolderName(string path)
{
    var end = -1;
    for (var i = path.Length; --i >= 0;)
    {
        var ch = path[i];
        if (ch == System.IO.Path.DirectorySeparatorChar ||
            ch == System.IO.Path.AltDirectorySeparatorChar ||
            ch == System.IO.Path.VolumeSeparatorChar)
        {
            if (end > 0)
            {
                return path.Substring(i + 1, end - i - 1);
            }

            end = i;
        }
    }

    if (end > 0)
    {
        return path.Substring(0, end);
    }

    return path;
}
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.