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.

pengembang747
sumber
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\";

A-Sharabiani
sumber
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 \

Siby Sunny
sumber
12

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

Anda juga dapat menggunakan Pathkelas.

Kelas C # Path

DotNetUser
sumber
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.

Jacco
sumber
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.

Olivier Jacot-Descombes
sumber
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);
CR41G14
sumber
2

C #

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

ini mungkin membantu

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}
Thomas
sumber
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.

Sauleil
sumber
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);
Taran
sumber
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