2009-05-15 12 views
295

C# 2008 SP1C# conseguir el camino de% AppData%

Estoy utilizando el código de abajo:

dt.ReadXml("%AppData%\\DateLinks.xml"); 

Sin embargo, yo estoy haciendo una excepción que apunta a la ubicación del lugar donde se está ejecutando mi solicitud a partir de:

no se pudo encontrar una parte de la ruta de 'D: \ Proyectos \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml'.

Pensé que el %AppData% debería encontrar la ruta relativa. Cuando voy al Start|Run|%AppData%, Windows Explorer me lleva a ese directorio.

No puedo ingresar la ruta completa, ya que el usuario es diferente en cada máquina cliente.

Muchas gracias por cualquier consejo,

Respuesta

635

para obtener los datos de programa del directorio , lo mejor es utilizar el GetFolderPath método:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

%AppData% es una variable de entorno, y que no se expanden automáticamente en cualquier parte en .NET, aunque puede usar explícitamente el método Environment.ExpandEnvironmentVariable para hacerlo. Sin embargo, le sugiero encarecidamente que utilice GetFolderPath, ya que, como señala Johannes Rössel en el comentario, %AppData% no se puede establecer en determinadas circunstancias.

Por último, para crear la ruta de acceso como se muestra en el ejemplo:

var fileName = Path.Combine(Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData), "DateLinks.xml"); 
+36

+1 por ofrecer una solución real, sin depender del medio ambiente. Para agregar a la respuesta: no todas las funciones que manejan nombres de archivos amplían las variables de entorno. De hecho, generalmente tiene que hacer esto explícitamente, de lo contrario no funciona y terminará con% something% folders. Además, el entorno no necesita estar presente, en algunos casos cuando se ejecuta un programa en otro usuario cuenta el entorno del usuario no se cargará y% Appdata% estará vacía. Es por eso que desearía utilizar las API documentadas para obtener esas carpetas (a menos que esté usando archivos por lotes). – Joey

+0

@Johannes: buena información allí. Acabo de modificar mi respuesta al publicarla, pero dejaré en claro que GetFolderPath es definitivamente preferible a ExpandEnvironmentVariable. – Noldorin

+0

+1 para Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), estaba detrás de esto por un par de días. –

6

no creo poniendo% AppData% en una cadena como que va a funcionar.

tratar

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).ToString() 
19

También puede utilizar

Environment.ExpandEnvironmentVariables("%AppData%\\DateLinks.xml"); 

para expandir la variable %AppData%.

43

La ruta es diferente si habla ASP.NET.

No pude encontrar ninguno de los valores de 'SpecialFolder' que apuntaban a/App_Data para ASP.NET.

su lugar usted necesita para hacer esto:

HttpContext.Current.ApplicationInstance.Server.MapPath("~/App_Data") 

(Nota: No es necesario la propiedad 'Actual' en un controlador MVC)

, si tener otra forma más de 'abstracta' para obtener a App_Data me encantaría escuchar cómo.

+0

Solo una nota ya que asp.net core se publicará ahora. Este enfoque se basa específicamente en IIS. –

+3

'HostingEnvironment.MapPath (@" ~/App_Data ")' es mejor y funciona en contextos MVC/WebAPI y WCF donde no hay HttpContext, pero no estoy seguro sobre core ' –

13

En .net2.0 se puede utilizar la variable Application.UserAppDataPath

+19

Esto es solo Winforms. – Will

20

La forma MEJOR para utilizar el directorio AppData, ES utilizar Environment.ExpandEnvironmentVariable método.

Razones:

  • que reemplaza partes de su cadena con directorios válidos o lo que sea
  • es sensible a las mayúsculas
  • es fácil y sin complicaciones
  • es un estándar
  • buena para tratar con la entrada del usuario

Ex amples:

string path; 
path = "%AppData%\stuff"; 
path = "%aPpdAtA%\HelloWorld"; 
path = "%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths 

path = Environment.ExpandEnvironmentVariables(path); 
Console.WriteLine(path); 

recordar algunos usuarios escriben %AppData%, algunos %appdata% y algunos %APpData% Usted no quiere terminar con:

if (path.ToLower().StartsWith("%appdata%")) 
    ; // path manipulation 
if (path.ToLower().StartsWith("%programfiles%")) 
    ; // path manipulation 

Si la variable de entorno no existe, lo que no es su Fallo (además de cuando eS). Por lo general, no le digo a la gente que no reinventé la rueda, pero después de que comencé por el otro lado y me di cuenta de que era una mala idea.

+0

Me gustaron sus ejemplos de la variable 'path' :) – RBT

3

Solo quería compartir otra forma de acceder a la carpeta 'App_Data' en mi aplicación mvc en caso de que alguien lo necesite.

Path.Combine(HttpRuntime.AppDomainAppPath,"App_Data") 
+0

Puede que no sea la respuesta correcta, pero es lo que estaba buscando. +1 – Derrick

+0

funcionó para mí después de reemplazar comillas simples con comillas dobles. Path.Combine (HttpRuntime.AppDomainAppPath, "App_Data") – ajaysinghdav10d

+0

@ ajaysinghdav10d buen punto He actualizado mi respuesta – cpoDesign