Bagaimana cara menavigasi beberapa folder ke atas?


115

Salah satu opsinya adalah melakukan System.IO.Directory.GetParent () beberapa kali. Apakah ada cara yang lebih baik untuk memindahkan beberapa folder ke atas dari tempat perakitan pelaksana berada?

Apa yang saya coba lakukan adalah menemukan file teks yang berada satu folder di atas folder aplikasi. Namun perakitan itu sendiri ada di dalam bin, yang merupakan beberapa folder jauh di dalam folder aplikasi.


2
biasanya jalur relatif melakukan trik seperti '.. \ .. \ .. \ .. \ Downfolder' tetapi tergantung pada apa sebenarnya Anda mencoba melakukan ini untuk ...?
DiskJunky

apakah ini selalu terjadi?
CR41G14

4
"Arahkan" bagaimana? Apakah yang Anda maksud direktori saat ini? Jika demikian, Anda seharusnya dapat melakukannyaDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Jawaban:


211

Cara sederhana lainnya adalah melakukan ini:

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

Catatan Ini naik dua tingkat. Hasilnya adalah: newPath = @"C:\Folder1\Folder2\";


18
Tidak ada gunanya menggunakan Path.Combinesaat Anda menambahkan garis miring terbalik secara manual. Pertimbangkan untuk menggunakan Path.Combine(path, "..", "..")sebagai gantinya.
AXMIM

32

Jika c: \ folder1 \ folder2 \ folder3 \ bin adalah path maka kode berikut akan mengembalikan path base folder dari folder bin

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

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

yaitu, c: \ folder1 \ folder2 \ folder3

jika Anda ingin path folder2 maka Anda bisa mendapatkan direktori dengan

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

maka Anda akan mendapatkan jalur sebagai c: \ folder1 \ folder2 \


12

Anda dapat menggunakan ..\pathuntuk naik satu level ke atas, ..\..\pathuntuk naik dua level dari jalur.

Anda juga dapat menggunakan Pathkelas.

Kelas C # Path


6

Inilah yang paling berhasil untuk saya:

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

Mendapatkan jalur yang 'benar' bukanlah masalah, menambahkan '../' jelas melakukan itu, tetapi setelah itu, string yang diberikan tidak dapat digunakan, karena itu hanya akan menambahkan '../' di akhir. Mengelilinginya dengan Path.GetFullPath()akan memberi Anda jalur absolut, membuatnya dapat digunakan.


4

Metode berikut mencari file yang dimulai dengan jalur startup aplikasi (folder * .exe). Jika file tidak ditemukan di sana, folder induk akan dicari hingga file tersebut ditemukan atau folder root telah dicapai. nulldikembalikan jika file tidak ditemukan.

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;
}

Catatan: Application.StartupPathbiasanya digunakan di aplikasi WinForms, tetapi juga berfungsi di aplikasi konsol; Namun, Anda harus menetapkan referensi ke System.Windows.Formsmajelis. Anda dapat mengganti Application.StartupPathdengan
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)jika Anda mau.


4

Mungkin Anda bisa menggunakan fungsi jika Anda ingin mendeklarasikan jumlah level dan memasukkannya ke dalam fungsi?

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

Dan Anda bisa menyebutnya seperti ini:

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

2

C #

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

1

ini mungkin membantu

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

1

Saya memiliki beberapa direktori virtual dan saya tidak dapat menggunakan metode Direktori. Jadi, saya membuat fungsi split / join sederhana untuk mereka yang tertarik. Tidak seaman.

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

Jadi, jika Anda ingin naik 4, Anda hanya perlu mengubah 1menjadi 4dan menambahkan beberapa centang untuk menghindari pengecualian.


0

Jika Anda mengetahui folder yang ingin Anda navigasikan, temukan indeksnya lalu substring.

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

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

2
Ini gagal dalam banyak kasus. Bagaimana jika nama foldernya saja a, misalnya? Bagaimana jika jalannya terlihat seperti ini C:\Folderame3\Folderame2\Folderame\...?
41686d6564

jika nama folder hanya pencarian "\\ a \\" atau \\ a jika yang terakhir
Taran
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.