2012-04-03 10 views
22

Ho un semplice problema. Ho un percorso di un file nella directory utente che assomiglia a questo:C# apre il file, percorso che inizia con% userprofile%

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

Quando provo ad aprire come file

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

Sputa errore perché tenta di aggiungere %userprofile% alla corrente directory, in modo che diventi:

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

Come faccio a farlo riconoscere che un percorso partendo %USERPROFILE% è una, non è un percorso relativo assoluto?

PS: Non posso usare

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Perché ho bisogno di aprire solo il file con il suo nome. L'utente specifica il nome. Se l'utente specifica "settings.file", ho bisogno di aprire un file relativo alla dir del programma, se l'utente specifica un percorso che inizia con %USERPROFILE% o qualche altra cosa che converte in C: \ qualcosa, ho bisogno di aprirlo!

risposta

45

Utilizzare Environment.ExpandEnvironmentVariables sul percorso prima di utilizzarlo.

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

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

Perché non solo "Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)'? –

+1

Perché questo è più generale - si presume che la variabile di ambiente passata sarà sempre '% USERPROFILE%' - cosa succede se è qualcos'altro? (che è quello che la domanda si pone - si tratta di espandere la variabile d'ambiente - che l'esempio usato è il profilo utente è incidentale). – Oded

+0

Ah, capisco. Cattivo esempio l'OP ha dato –

5

Utilizzare il Environment.ExpandEnvironmentVariables metodo statico:

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

Non dimenticare di usare un'istruzione 'using' per il flusso. – Oded

-1

È anche possibile utilizzare la costante Environment.Username. Entrambi gli %USERPROFILE% e questa variabile di Ambiente puntano allo stesso modo (che è l'utente attualmente registrato). Ma se scegli in questo modo, devi concatenare il percorso da solo.

+1

Ok, c'è una piccola differenza, quello che ho dimenticato. La variabile di ambiente significa "C: \ Users \ {username}" mentre l'altra solo "{username}" – NeverJr

+4

No. Il nome utente potrebbe non essere uguale al nome della cartella del profilo utente, per favore non dare per scontato questo. (Considerare quando esiste già una cartella e viene creato un nuovo utente con lo stesso nome - Windows sceglierà un nuovo nome di cartella) – HelloSam

0

Io lo uso nella mia libreria Utilità.

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

Quindi posso semplicemente utilizzare per es. "string testBenchPath = MyProfile.Path (" TestResults ");"

Problemi correlati