2011-01-06 23 views
12

Tengo dificultades para encontrar una forma de especificar una ubicación de archivo en web.config appSettings que evita el uso de rutas codificadas pero que no son "web-aware" Biblioteca C# para encontrar un archivo.Especificación de la ubicación relativa del archivo en web.config para su uso en la biblioteca de clase C# estándar

La biblioteca C# utiliza los métodos estándar File.Open, File.Exists, etc. para operar en un archivo de datos, que se almacena en el árbol de mi aplicación web (ASP.NET MVC), p. en:

\content\data\MyDataFile.txt 

Requisitos:

  • Quiero ser capaz de especificar mi camino como, por ejemplo:
 
     <appSettings> 
this-->  <add key="MyFileLocation" value="~\content\data\MyDataFile.txt" /> 
not -->  <add key="MyFileLocation" value="c:\inetpub\wwwroot\foo\content\data\MyDataFile.txt" /> 
     </appSettings> 
  • no quiero el C# biblioteca para tenga en cuenta la aplicación web en la que se está utilizando, ya que se usa en otro software, y la aplicación web no necesita conocer la configuración de C# libra ry así que realmente no quiero pasar información de configuración entre las capas si es posible.

¿Alguna sugerencia sobre cómo puedo hacer esto limpiamente? ¡Gracias!

Respuesta

23

Usted podría utilizar Path.Combine combinar AppDomain.CurrentDomain.BaseDirectory y su ruta relativa.

Esto le dará una ruta relativa al directorio raíz ASP.NET (~ /) en una aplicación ASP.NET, o una ruta relativa al directorio que contiene el ejecutable en una aplicación WinForms o consola.

+0

Acabo de descubrir esto también, pero te daré los puntos! Ciertamente funciona en mi caso (y en una aplicación de consola que noqueé para probar). ¿Alguna idea de si hay algún caso, esto fracasará? Gracias. –

-1

si lo hace

File.Open(@"content\data\file.txt") 

Será relativa a la ubicación de montaje de ejecución.

+6

Que, en el caso de una aplicación web, suele ser el 'c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Archivos ASP.NET temporales' que casi siempre _no_ lo que desea. –

+1

-1 - esto es incorrecto, será relativo al directorio de trabajo actual - podría ser% WINDIR% \ system32 \ inetsrv si se ejecuta bajo IIS o el directorio que contiene el servidor web Cassini si se ejecuta bajo Visual Studio. En general, no es una buena idea hacer suposiciones sobre el directorio de trabajo actual. – Joe

4

¿Por qué no hacer que la aplicación web lea la ruta desde el archivo de configuración, resolverlo usando Server.MapPath y luego pasar la ruta resultante a la biblioteca de clases?


Según su comentario, tengo una sugerencia diferente: no utilice rutas relativas.

+0

Sí, he considerado eso pero me he mostrado reacio a hacerlo, ya que reduce la separación de preocupaciones en mi aplicación; requeriría que mi aplicación web participe en la configuración de la biblioteca (a la que se accede a través de interfaces, por lo que podría ser intercambiada más adelante). –

+0

@Tim: su aplicación web ya es responsable de la configuración por el hecho de que los valores de configuración se almacenan en el sitio web. Además, la aplicación web aparentemente llama a la asamblea (no es independiente después de todo). Esta es la "preocupación" equivocada de estar "separando". – NotMe

+0

@Chris: la configuración de todos los ensamblados llamados por la aplicación web se almacena en web.config. Así es como funciona .NET, solo un archivo de configuración por Dominio de aplicación. Es razonable que no pase la ruta a la biblioteca, ya que las diferentes bibliotecas pueden tener diferentes rutas u otra configuración. –

0

Por ejemplo

En su web.config

<appSettings> 
     <add key="FilePath" value="~/images"/> 
    </appSettings> 

y en su código detrás de archivo de Cs

string filters = "*.jpg;*.png;*.gif"; 
    string Path = ConfigurationManager.AppSettings["FilePath"].ToString(); 

    List<String> images = new List<string>(); 

    foreach (string filter in filters.Split(';')) 
    { 
     FileInfo[] fit = new DirectoryInfo(this.Server.MapPath("~/images")).GetFiles(filter); 
     foreach (FileInfo fi in fit) 
     { 
      images.Add(String.Format(Path + "/{0}", fi));     
     } 
    } 

    RepeaterImages.DataSource = images; 
    RepeaterImages.DataBind(); 
0

También puede hacer esto:

en Web. config:

<add key="MyFileLocation" value="content/dataMyDataFile.txt" /> 

En su código:

string filePath = ConfigurationManager.AppSettings["MyFileLocation"]; 
    Path.Combine(AppDomain.CurrentDomain.BaseDirectory, filePath) 

El resultado dará algo como: "C: \ tuproyecto \ content \ dataMyDataFile" o algo por el estilo.

Cuestiones relacionadas