จะไปยังโฟลเดอร์ต่างๆได้อย่างไร?


115

ทางเลือกหนึ่งคือทำ System.IO.Directory.GetParent () สองสามครั้ง มีวิธีที่สวยงามกว่าในการเดินทางสองสามโฟลเดอร์จากที่ที่มีการเรียกใช้แอสเซมบลีอยู่หรือไม่?

สิ่งที่ฉันพยายามทำคือค้นหาไฟล์ข้อความที่อยู่หนึ่งโฟลเดอร์เหนือโฟลเดอร์แอปพลิเคชัน แต่แอสเซมบลีนั้นอยู่ภายในถังขยะซึ่งอยู่ลึกลงไปในโฟลเดอร์แอปพลิเคชัน


2
โดยปกติเส้นทางสัมพัทธ์จะใช้เคล็ดลับเช่น '.. \ .. \ .. \ .. \ Downfolder' แต่มันขึ้นอยู่กับว่าคุณกำลังพยายามทำสิ่งนี้เพื่ออะไร ... ?
DiskJunky

เป็นเช่นนี้เสมอหรือ
CR41G14

4
"นำทาง" อย่างไร คุณหมายถึงไดเร็กทอรีปัจจุบันหรือไม่? ถ้าเป็นเช่นนั้นคุณควรจะทำได้Directory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

คำตอบ:


211

วิธีง่ายๆอื่น ๆ คือทำสิ่งนี้:

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

หมายเหตุสิ่งนี้เพิ่มขึ้นสองระดับ ผลลัพธ์จะเป็น: newPath = @"C:\Folder1\Folder2\";


18
ไม่มีจุดใดที่จะใช้Path.Combineเมื่อคุณเพิ่มแบ็กสแลชด้วยตนเอง ลองใช้Path.Combine(path, "..", "..")แทน
AXMIM

32

ถ้า c: \ folder1 \ folder2 \ folder3 \ bin เป็นเส้นทางจากนั้นรหัสต่อไปนี้จะส่งคืนโฟลเดอร์ฐานเส้นทางของโฟลเดอร์ bin

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

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

เช่น C: \ folder1 \ folder2 \ folder3

หากคุณต้องการพา ธ โฟลเดอร์ 2 คุณสามารถรับไดเร็กทอรีโดย

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

จากนั้นคุณจะได้รับเส้นทางเป็น c: \ folder1 \ folder2 \


12

คุณสามารถใช้..\pathเพื่อขึ้นไปหนึ่งระดับ..\..\pathไปสองระดับจากเส้นทาง

คุณสามารถใช้Pathคลาสได้เช่นกัน

คลาส C # Path


6

นี่คือสิ่งที่ได้ผลดีที่สุดสำหรับฉัน:

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

การเดินทางไปยังเส้นทางที่ 'ถูกต้อง' ไม่ใช่ปัญหาการเพิ่ม "../" เห็นได้ชัดว่าทำเช่นนั้น แต่หลังจากนั้นสตริงที่ระบุจะไม่สามารถใช้งานได้เพราะจะเพิ่ม "../" ในตอนท้าย การล้อมรอบด้วยPath.GetFullPath()จะทำให้คุณมีเส้นทางที่แน่นอนทำให้ใช้งานได้


4

วิธีการต่อไปนี้จะค้นหาไฟล์ที่ขึ้นต้นด้วยเส้นทางการเริ่มต้นแอปพลิเคชัน (โฟลเดอร์ * .exe) หากไม่พบไฟล์ที่นั่นโฟลเดอร์หลักจะถูกค้นหาจนกว่าจะพบไฟล์หรือถึงโฟลเดอร์รูท nullจะถูกส่งกลับหากไม่พบไฟล์

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

หมายเหตุ: Application.StartupPathโดยปกติจะใช้ในแอปพลิเคชัน WinForms แต่ใช้ได้กับแอปพลิเคชันคอนโซลด้วย อย่างไรก็ตามคุณจะต้องตั้งค่าการอ้างอิงไปยังSystem.Windows.Formsแอสเซมบลี คุณสามารถแทนที่Application.StartupPathโดย
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)ถ้าคุณต้องการ


4

บางทีคุณอาจใช้ฟังก์ชันถ้าคุณต้องการประกาศจำนวนระดับและใส่ลงในฟังก์ชัน?

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

และคุณสามารถเรียกสิ่งนี้ว่า:

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


1

สิ่งนี้อาจช่วยได้

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

1

ฉันมีไดเรกทอรีเสมือนบางส่วนและฉันไม่สามารถใช้เมธอด Directory ได้ ดังนั้นฉันจึงสร้างฟังก์ชันแยก / เข้าร่วมอย่างง่ายสำหรับผู้ที่สนใจ ไม่ปลอดภัยเท่า

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

ดังนั้นถ้าคุณต้องการที่จะย้าย 4 ขึ้นไปคุณก็ต้องเปลี่ยน1ไป4และเพิ่มการตรวจสอบบางอย่างเพื่อหลีกเลี่ยงข้อยกเว้น


0

หากคุณรู้จักโฟลเดอร์ที่ต้องการนำทางให้ค้นหาดัชนีของโฟลเดอร์นั้นจากนั้นจึงเป็นสตริงย่อย

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

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

2
สิ่งนี้ล้มเหลวในหลาย ๆกรณี จะเกิดอะไรขึ้นถ้าชื่อของโฟลเดอร์เป็นเพียงแค่a? จะเกิดอะไรขึ้นถ้าเส้นทางมีลักษณะเช่นนี้C:\Folderame3\Folderame2\Folderame\...?
41686d6564

ถ้าชื่อโฟลเดอร์เป็นเพียงการค้นหา "\\ a \\" หรือ \\ a ถ้าเป็นครั้งสุดท้าย
Taran
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.