Làm cách nào để điều hướng một vài thư mục lên trên?


115

Một tùy chọn sẽ là thực hiện System.IO.Directory.GetParent () một vài lần. Có cách nào dễ dàng hơn để di chuyển một vài thư mục từ nơi tập hợp thực thi cư trú không?

Những gì tôi cố gắng làm là tìm một tệp văn bản nằm trong một thư mục phía trên thư mục ứng dụng. Nhưng bản thân tập hợp đó nằm bên trong thùng, là một vài thư mục nằm sâu trong thư mục ứng dụng.


2
thường thì một đường dẫn tương đối thực hiện thủ thuật như '.. \ .. \ .. \ .. \ Downfolder' nhưng nó phụ thuộc vào chính xác bạn đang cố gắng thực hiện điều này để làm gì ...?
DiskJunky

Luôn luôn là trường hợp này sao?
CR41G14

4
"Điều hướng" như thế nào? Bạn có nghĩa là thư mục hiện tại? Nếu vậy, bạn sẽ có thể làmDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Câu trả lời:


211

Cách đơn giản khác là làm điều này:

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

Lưu ý Điều này tăng hai cấp. Kết quả sẽ là: newPath = @"C:\Folder1\Folder2\";


18
Không có ích gì Path.Combinekhi bạn đang thêm dấu gạch chéo ngược theo cách thủ công. Cân nhắc sử dụng Path.Combine(path, "..", "..")thay thế.
AXMIM

32

nếu c: \ folder1 \ folder2 \ folder3 \ bin là đường dẫn thì đoạn mã sau sẽ trả về thư mục cơ sở đường dẫn của thư mục bin

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

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

tức là, c: \ folder1 \ folder2 \ folder3

nếu bạn muốn đường dẫn folder2 thì bạn có thể lấy thư mục bằng cách

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

sau đó bạn sẽ nhận được đường dẫn là c: \ folder1 \ folder2 \



6

Đây là điều tốt nhất cho tôi:

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

Nhận được đường dẫn 'đúng' không phải là vấn đề, thêm '../' rõ ràng là làm được điều đó, nhưng sau đó, chuỗi đã cho không thể sử dụng được, vì nó sẽ chỉ thêm '../' vào cuối. Bao quanh nó Path.GetFullPath()sẽ cung cấp cho bạn đường dẫn tuyệt đối, giúp nó có thể sử dụng được.


4

Phương pháp sau tìm kiếm một tệp bắt đầu bằng đường dẫn khởi động ứng dụng (thư mục * .exe). Nếu không tìm thấy tệp ở đó, các thư mục mẹ sẽ được tìm kiếm cho đến khi tìm thấy tệp hoặc đến được thư mục gốc. nullđược trả lại nếu tệp không được tìm thấy.

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

Lưu ý: Application.StartupPaththường được sử dụng trong các ứng dụng WinForms, nhưng nó cũng hoạt động trong các ứng dụng console; tuy nhiên, bạn sẽ phải thiết lập một tham chiếu đến System.Windows.Formsassembly. Bạn có thể thay thế Application.StartupPathbằng
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)nếu bạn thích.


4

Có lẽ bạn có thể sử dụng một hàm nếu bạn muốn khai báo số cấp và đặt nó vào một hàm?

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

Và bạn có thể gọi nó như thế này:

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

2

C #

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

1

điều này có thể giúp

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

1

Tôi có một số thư mục ảo và tôi không thể sử dụng các phương thức Thư mục. Vì vậy, tôi đã tạo một chức năng tách / tham gia đơn giản cho những người quan tâm. Tuy nhiên, không an toàn.

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

Vì vậy, nếu bạn muốn di chuyển 4 lên, bạn chỉ cần thay đổi 1thành 4và thêm một số kiểm tra để tránh ngoại lệ.


0

Nếu bạn biết thư mục bạn muốn điều hướng đến, hãy tìm chỉ mục của nó sau đó tìm chuỗi con.

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

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

2
Điều này không thành công trong rất nhiều trường hợp. aVí dụ, nếu tên của thư mục là gì? Nếu đường dẫn trông như thế này thì C:\Folderame3\Folderame2\Folderame\...sao?
41686d6564

nếu tên thư mục chỉ là tìm kiếm "\\ a \\" hoặc \\ a nếu là cuối cùng của nó
Taran
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.