2012-04-03 18 views
22

Tengo un problema simple. Tengo una ruta a un archivo en el directorio de usuario que tiene este aspecto:C# abrir archivo, ruta que comienza con% userprofile%

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

Cuando intento abrir como un archivo

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

Escupe error porque intenta añadir %userprofile% a la corriente directorio, por lo que se convierte en:

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

¿Cómo hago que reconocer que una ruta que comienza con %USERPROFILE% es una, no una ruta relativa absoluta?

PS: No puedo usar

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Porque necesito simplemente abrir el archivo por su nombre. El usuario especifica el nombre. Si el usuario especifica "settings.file", necesito abrir un archivo relativo al directorio del programa, si el usuario especifica una ruta que comienza con %USERPROFILE% o alguna otra cosa que se convierta en C: \ something, ¡también tengo que abrirla!

Respuesta

45

Utilice Environment.ExpandEnvironmentVariables en el camino antes de usarlo.

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

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

¿Por qué no simplemente 'Environment.GetFolderPath (Environment.SpecialFolder.LocalApplicationData)'? –

+1

Como esto es más general, está asumiendo que la variable de entorno transferida siempre será '% PERFIL DE USUARIO%' - ¿Y si es algo más? (que es lo que hace la pregunta, pregunta sobre la ampliación de la variable de entorno), que el ejemplo utilizado es el perfil de usuario incidental). – Oded

+0

Ahh, ya veo. Mal ejemplo, el OP dio –

5

Utilice el método estático Environment.ExpandEnvironmentVariables:

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

No se olvide de usar una declaración 'using' para la transmisión. – Oded

-1

También puede usar la constante Environment.Username. Tanto %USERPROFILE% como esta variable de entorno señalan lo mismo (que es el usuario actualmente registrado). Pero si elige de esta manera, debe concatenar el camino usted mismo.

+1

Ok, hay una pequeña diferencia, lo que olvidé. La variable de entorno significa "C: \ Users \ {username}" mientras que la otra solo es "{username}" – NeverJr

+4

No. El nombre de usuario podría no ser el mismo que el nombre de la carpeta del perfil de usuario, no asuma esto. (Considere cuando la carpeta ya existe y se está creando un nuevo usuario con el mismo nombre: Windows elegirá un nuevo nombre para la carpeta) – HelloSam

0

Lo uso en mi biblioteca de utilidades.

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

Así que puedo simplemente utilizar, p. "string testBenchPath = MyProfile.Path (" TestResults ");"

Cuestiones relacionadas