2012-04-03 10 views
22

Mam prosty problem. Mam ścieżkę do pliku w katalogu użytkownika, który wygląda tak:C# otwarty plik, ścieżka rozpoczynająca się od% userprofile%

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

Kiedy próbuję otworzyć go jako plik

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

on pluje błąd, ponieważ próbuje dodać %userprofile% do prądu katalog, więc staje się:

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

Jak zrobić, żeby ją rozpoznać, że ścieżka zaczynając %USERPROFILE% jest absolutna, a nie ścieżka względna?

PS: Nie mogę używać

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Bo trzeba po prostu otworzyć plik o nazwie. Użytkownik określa nazwę. Jeśli użytkownik określi "plik settings.file", muszę otworzyć plik w stosunku do katalogu programu, jeśli użytkownik określi ścieżkę rozpoczynającą się od %USERPROFILE% lub inną rzeczą, która konwertuje do C: \ coś, muszę go również otworzyć!

Odpowiedz

45

Użyj ścieżki Environment.ExpandEnvironmentVariables przed użyciem.

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

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

Dlaczego po prostu 'Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)'? –

+1

Ponieważ jest to bardziej ogólne - zakładasz, że przekazana zmienna środowiskowa zawsze będzie miała wartość "% USERPROFILE%" - a jeśli to coś innego? (o to właśnie pyta - pyta o rozszerzenie zmiennej środowiskowej - że użyty przykład to profil użytkownika jest przypadkiem). – Oded

+0

Ahh, rozumiem. Zły przykład OP dał –

5

Użyj Environment.ExpandEnvironmentVariables statyczna metoda:

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

Nie zapomnij użyć instrukcji 'using' dla strumienia. – Oded

-1

Można również użyć stałej Environment.Username. Zarówno %USERPROFILE%, jak i ta zmienna środowiskowa wskazują to samo (co jest aktualnie zalogowanym użytkownikiem). Ale jeśli wybierzesz tę drogę, musisz połączyć ścieżkę samodzielnie.

+1

OK, jest mała różnica, o czym zapomniałem. Zmienna środowiskowa oznacza "C: \ Users \ {username}", a druga tylko "{username}" – NeverJr

+4

Nie. Nazwa użytkownika może nie być taka sama jak nazwa folderu profilu użytkownika, proszę nie zakładać tego. (Rozważ, kiedy folder już istnieje i tworzony jest nowy użytkownik o tej samej nazwie - system Windows wybierze nową nazwę folderu) – HelloSam

0

Używam tego w mojej bibliotece narzędzi.

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

Więc mogę po prostu użyć np. "string testBenchPath = MyProfile.Path (" TestResults ");"

Powiązane problemy