2009-09-09 52 views
64

Làm cách nào để chuyển đổi đường dẫn tương đối thành đường dẫn tuyệt đối trong ứng dụng Windows?Làm thế nào để chuyển đổi đường dẫn tương đối thành đường dẫn tuyệt đối trong ứng dụng Windows?

Tôi biết chúng tôi có thể sử dụng server.MapPath() trong ASP.NET. Nhưng chúng ta có thể làm gì trong một ứng dụng Windows?

Tôi có nghĩa là, nếu có một NET tích hợp chức năng có thể xử lý mà ...

+1

Bạn có nghĩa là đường dẫn tương đối đến thư mục hiện tại, nói cách khác là thư mục làm việc hoặc liên quan đến vị trí của .exe? –

+1

Có hai loại đường dẫn tương đối. Một nếu có dạng "A \ B \ C" và không ngụ ý một cơ sở cụ thể. Cái còn lại có dạng ". \ A \ B" hoặc ".. \ A \ B"; chúng tương đối so với thư mục làm việc hiện tại. – MSalters

+0

@Amit Dhall: Bằng cách này, nó là điều tốt để chấp nhận và upvote câu trả lời (s) giúp bạn. –

Trả lời

129

Các bạn đã thử:

string absolute = Path.GetFullPath(relative); 

? Lưu ý rằng sẽ sử dụng thư mục làm việc hiện tại của tiến trình, không phải thư mục chứa tệp thi hành. Nếu điều đó không hiệu quả, vui lòng làm rõ câu hỏi của bạn.

+2

Điều đó không phụ thuộc vào nơi bạn khởi động ứng dụng, không phụ thuộc vào vị trí của exe? Cấp câu hỏi là không thực sự rõ ràng về điều đó. –

+0

Như bạn nói, câu hỏi không rõ ràng. GetFullPath sẽ giải quyết từ thư mục làm việc hiện tại. Tôi sẽ chỉnh sửa câu trả lời của tôi để cho biết điều này. –

+0

Nếu một ứng dụng được khởi động thông qua Windows Explorer, có vẻ như thư mục hiện tại và thư mục assembly thực thi giống nhau (ít nhất là cho đến khi một cái gì đó được thực hiện để làm cho chúng khác nhau). Điều này là đúng ngay cả khi bạn sử dụng một đoạn ngắn để thực thi, nơi cắt ngắn cư trú ở một nơi nào đó hoàn toàn khác nhau. – H2ONaCl

17

Nếu bạn muốn nhận được đường dẫn tương đối để .exe của bạn sau đó sử dụng

string absolute = Path.Combine(Application.ExecutablePath, relative); 
+1

Hoặc, nói chung, Path.Combine (myBasePath, tương đối) ... –

+3

Chỉ cần cẩn thận với Path.Combine. Nếu phần 'tương đối' bắt đầu bằng dấu gạch chéo, nó có thể không làm điều bạn nghĩ. –

+1

@ silky: tốt, sau đó nó không phải là tương đối, phải không? –

11

một này làm việc cho đường dẫn vào ổ đĩa khác nhau, các đường dẫn ổ đĩa tương đối và cho đường dẫn tương đối thực tế. Heck, nó thậm chí hoạt động nếu basePath không thực sự tuyệt đối; nó luôn luôn sử dụng thư mục làm việc hiện tại như là dự phòng cuối cùng.

public static String GetAbsolutePath(String relativePath, String basePath) 
{ 
    if (relativePath == null) 
     return null; 
    if (basePath == null) 
     basePath = Path.GetFullPath("."); // quick way of getting current working directory 
    else 
     basePath = GetAbsolutePath(basePath, null); // to be REALLY sure ;) 
    String path; 
    // specific for windows paths starting on \ - they need the drive added to them. 
    // I constructed this piece like this for possible Mono support. 
    if (!Path.IsPathRooted(relativePath) || "\\".Equals(Path.GetPathRoot(relativePath))) 
    { 
     if (relativePath.StartsWith(Path.DirectorySeparatorChar.ToString())) 
      path = Path.Combine(Path.GetPathRoot(basePath), relativePath.TrimStart(Path.DirectorySeparatorChar)); 
     else 
      path = Path.Combine(basePath, relativePath); 
    } 
    else 
     path = relativePath; 
    // resolves any internal "..\" to get the true full path. 
    return Path.GetFullPath(path); 
} 
+0

Giải pháp tuyệt vời vì nó kết hợp đường dẫn tuyệt đối hoặc người thân theo đường cơ sở. Theo quan điểm của tôi, đối số relativePath nên được đổi tên thành AbsoluteOrRelativePath, vì nó là những gì nó thực sự đại diện. Cảm ơn –

+0

Vâng, nếu nó đã là một con đường tuyệt đối, đó chỉ là một trường hợp đặc biệt, thực sự ... chức năng vẫn có nghĩa là để giải quyết đường dẫn tương đối, lol. Tôi chỉ đặt tên nó ở đây để làm cho nó rõ ràng mà tham số là;) – Nyerguds

+0

@ JulioNobre đặc biệt là kể từ khi args ở đây được đảo ngược so với 'Path.Combine'. Đó là dễ dàng cố định, nhưng tôi tránh nó vì tôi thường sử dụng nó để giải quyết đường dẫn tương đối trên thư mục làm việc, và cho null như arg đầu tiên trông lạ. – Nyerguds

Các vấn đề liên quan