2012-04-03 41 views
22

Tôi có một vấn đề đơn giản. Tôi có một đường dẫn đến một tập tin trong thư mục người dùng trông như thế này:C# mở tập tin, đường dẫn bắt đầu với% userprofile%

%USERPROFILE%\AppData\Local\MyProg\settings.file 

Khi tôi cố gắng để mở nó như một tập tin

ostream = new FileStream(fileName, FileMode.Open); 

Nó spits lỗi vì nó cố gắng thêm %userprofile% đến hiện tại thư mục, vì vậy nó trở thành:

C:\Program Files\MyProg\%USERPROFILE%\AppData\Local\MyProg\settings.file 

làm thế nào để làm cho nó nhận ra rằng một con đường bắt đầu với %USERPROFILE% là một tuyệt đối, không phải là một đường dẫn tương đối?

PS: Tôi không thể sử dụng

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Bởi vì tôi cần phải chỉ cần mở tập tin bằng tên của nó. Người dùng chỉ định tên. Nếu người dùng chỉ định "settings.file", tôi cần mở tệp có liên quan đến thư mục chương trình, nếu người dùng chỉ định đường dẫn bắt đầu bằng %USERPROFILE% hoặc một số thứ khác chuyển đổi thành C: \ gì đó, tôi cũng cần mở nó!

Trả lời

45

Sử dụng Environment.ExpandEnvironmentVariables trên đường dẫn trước khi sử dụng.

var pathWithEnv = @"%USERPROFILE%\AppData\Local\MyProg\settings.file"; 
var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv); 

using(ostream = new FileStream(filePath, FileMode.Open)) 
{ 
    //... 
} 
+0

Tại sao không chỉ 'Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)'? –

+1

Vì đây là tổng quát hơn - bạn giả thiết rằng biến môi trường được truyền vào sẽ luôn là '% USERPROFILE%' - nếu nó là cái gì khác? (đó là những gì câu hỏi đang hỏi - đó là yêu cầu về việc mở rộng biến môi trường - ví dụ được sử dụng là hồ sơ người dùng là ngẫu nhiên). – Oded

+0

Ahh, tôi hiểu rồi. Ví dụ xấu OP đã cho –

5

Sử dụng Environment.ExpandEnvironmentVariables phương pháp tĩnh:

string fileName= Environment.ExpandEnvironmentVariables(fileName); 
ostream = new FileStream(fileName, FileMode.Open); 
+1

Đừng quên sử dụng câu lệnh 'using' cho luồng. – Oded

-1

Bạn cũng có thể sử dụng hằng số Environment.Username. Cả hai số %USERPROFILE% và biến Môi trường này đều giống nhau (là người dùng hiện đã đăng nhập). Nhưng nếu bạn chọn cách này, bạn phải tự mình nối đường đi.

+1

Ok, có một chút khác biệt, những gì tôi quên. Biến môi trường có nghĩa là "C: \ Users \ {username}" trong khi chỉ khác "{username}" – NeverJr

+4

No. Tên người dùng có thể không giống với tên thư mục hồ sơ người dùng, vui lòng không giả định điều này. (Xem xét khi thư mục đã tồn tại và người dùng mới cùng tên đang được tạo - Windows sẽ chọn một tên thư mục mới) – HelloSam

0

Tôi sử dụng điều này trong thư viện Tiện ích của mình.

using System; 
namespace Utilities 
{ 
    public static class MyProfile 
    { 
     public static string Path(string target) 
     { 
      string basePath = 
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + 
@"\Automation\"; 
      return basePath + target; 
     } 
    } 
} 

Vì vậy, tôi chỉ đơn giản có thể sử dụng ví dụ: "string testBenchPath = MyProfile.Path (" TestResults ");"

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