Birkaç klasör yukarı nasıl gezilir?


115

Bir seçenek, System.IO.Directory.GetParent () işlevini birkaç kez yapmak olacaktır. Yürütme derlemesinin bulunduğu yerden birkaç klasörü yukarı taşımanın daha zarif bir yolu var mı?

Yapmaya çalıştığım şey, uygulama klasörünün üzerinde bir klasör bulunan bir metin dosyası bulmak. Ancak derlemenin kendisi, uygulama klasörünün derinliklerindeki birkaç klasör olan bölmenin içindedir.


2
genellikle göreli bir yol '.. \ .. \ .. \ .. \ Alt klasör' gibi bir numara yapar, ancak bunu tam olarak ne için yapmaya çalıştığınıza bağlıdır ...?
DiskJunky

bu her zaman böyle midir?
CR41G14

4
Nasıl "gezinmek"? Şu anki dizini mi kastediyorsunuz? Eğer öyleyse, yapabilmelisinDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Yanıtlar:


211

Diğer basit yol, bunu yapmaktır:

string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));

Not Bu, iki seviye yukarı çıkar. Sonuç şöyle olacaktır: newPath = @"C:\Folder1\Folder2\";


18
Path.CombineZaten manuel olarak ters eğik çizgi eklediğinizde kullanmanın bir anlamı yoktur . Path.Combine(path, "..", "..")Bunun yerine kullanmayı düşünün .
AXMIM

32

c: \ klasör1 \ klasör2 \ klasör3 \ bin yol ise, aşağıdaki kod bin klasörünün yol temel klasörünü döndürür

//string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString());

string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString();

örneğin, C: \ klasör1 \ klasör2 \ folder3

klasör2 yolunu istiyorsanız, dizini şu şekilde alabilirsiniz:

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();

o zaman yolu c: \ klasör1 \ klasör2 \ olarak alacaksınız


12

Yoldan iki ..\pathseviye yukarı çıkmak için bir seviye yukarı çıkmak için kullanabilirsiniz ..\..\path.

PathSınıfı da kullanabilirsin .

C # Yol sınıfı


6

Benim için en çok işe yarayan şey buydu:

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));

Sorun "doğru" yolu bulmak değil, tabii ki "../" eklemek bunu yapar, ancak ondan sonra verilen dizge kullanılamaz, çünkü sonuna "../" ekler. Onu Path.GetFullPath()çevrelemek size mutlak yolu verecek ve onu kullanılabilir kılacaktır.


4

Aşağıdaki yöntem, uygulama başlangıç ​​yolu (* .exe klasörü) ile başlayan bir dosyayı arar. Dosya orada bulunamazsa, dosya bulunana veya kök klasöre ulaşılana kadar üst klasörler aranır. nulldosya bulunamazsa döndürülür.

public static FileInfo FindApplicationFile(string fileName)
{
    string startPath = Path.Combine(Application.StartupPath, fileName);
    FileInfo file = new FileInfo(startPath);
    while (!file.Exists) {
        if (file.Directory.Parent == null) {
            return null;
        }
        DirectoryInfo parentDir = file.Directory.Parent;
        file = new FileInfo(Path.Combine(parentDir.FullName, file.Name));
    }
    return file;
}

Not: Application.StartupPathgenellikle WinForms uygulamalarında kullanılır, ancak konsol uygulamalarında da çalışır; ancak, System.Windows.Formsmontaja bir referans belirlemeniz gerekecektir . Sen değiştirebilir Application.StartupPathtarafından
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)İsterseniz.


4

Seviye sayısını bildirmek ve onu bir işleve koymak istiyorsanız, belki bir işlevi kullanabilirsiniz?

private String GetParents(Int32 noOfLevels, String currentpath)
{
     String path = "";
     for(int i=0; i< noOfLevels; i++)
     {
         path += @"..\";
     }
     path += currentpath;
     return path;
}

Ve buna şöyle diyebilirsiniz:

String path = this.GetParents(4, currentpath);

2

C #

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));

1

bu yardımcı olabilir

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}

1

Bazı sanal dizinlerim var ve Dizin yöntemlerini kullanamıyorum. Bu yüzden ilgilenenler için basit bir bölme / birleştirme işlevi yaptım. Yine de o kadar güvenli değil.

var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());

Yani, 4'ü yukarı taşımak istiyorsanız, istisnaları önlemek 1için sadece olarak değiştirmeniz 4ve bazı kontroller eklemeniz gerekir .


0

Gitmek istediğiniz klasörü biliyorsanız, dizinini ve ardından alt dizeyi bulun.

            var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);

2
Bu pek çok durumda başarısız olur . aÖrneğin , klasörün adı sadece ise? Ya yol böyle görünüyorsa C:\Folderame3\Folderame2\Folderame\...?
41686d6564

klasör adı yalnızca bir "\\ a \\" aramasıysa veya sonuncusuysa \\ a
Taran
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.