C # obteniendo la ruta de% AppData%

C # 2008 SP1

Estoy usando el siguiente código:

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

Sin embargo, recibo una excepción que apunta a la ubicación de donde se ejecuta mi aplicación:

No se pudo encontrar una parte de la ruta ‘D: \ Projects \ SubVersionProjects \ CatDialer \ bin \ Debug \% AppData% \ DateLinks.xml’.

Pensé que %AppData% debería encontrar la ruta relativa. Cuando voy a 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,

Para obtener el directorio AppData , es mejor utilizar el método GetFolderPath :

 Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

%AppData% es una variable de entorno y no se expande automáticamente en ninguna parte de .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.

Finalmente, para crear la ruta como se muestra en su ejemplo:

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

La ruta es diferente si estás hablando de ASP.NET.

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

En cambio, necesitas hacer esto:

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

(Nota: no necesita la propiedad ‘Actual’ en un controlador MVC)

Si hay otra forma más ‘abstracta’ de llegar a App_Data , me encantaría saber cómo.

La MEJOR manera de utilizar el directorio AppData, IS , es usar el método Environment.ExpandEnvironmentVariable .

Razones:

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

Ejemplos:

 string path; path = "%AppData%\stuff"; path = "%aPpdAtA%\HelloWorld"; path = "%progRAMfiLES%\Adobe;%appdata%\FileZilla"; // collection of paths path = Environment.ExpandEnvironmentVariables(path); Console.WriteLine(path); 

Recuerde que algunos usuarios %appdata% %AppData% , algunos %appdata% y algunos %APpData% . No desea terminar con:

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

Si la variable de entorno no está configurada, no es su culpa (además de cuando sí lo es ). Usualmente no le digo a la gente que no reinvente la rueda, pero después de que comencé por el otro lado y me di cuenta de que era una mala idea.

También puedes usar

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

para expandir la variable %AppData% .

En .net2.0 puede usar la variable Application.UserAppDataPath

No creo que poner% AppData% en una cadena como esa funcionará.

tratar

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

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") 

Esto funciona para mí en una aplicación de consola:

 string appData = System.Environment.GetEnvironmentVariable("APPDATA");