2011-01-06 20 views
12

Я пытаюсь найти способ указания местоположения файла в web.config appSettings, который позволяет избежать использования жестко закодированных путей, но позволяет использовать не -web- C#, чтобы найти файл.Задание относительного местоположения файла в web.config для использования стандартной библиотекой классов C#

В библиотеке C# используются стандартные методы File.Open, File.Exists и т. Д. Для работы с файлом данных, который хранится в дереве моего веб-приложения (ASP.NET MVC), например. в:

\content\data\MyDataFile.txt 

Требования:

  • Я хочу, чтобы иметь возможность указать свой путь, как, например:
 
     <appSettings> 
this-->  <add key="MyFileLocation" value="~\content\data\MyDataFile.txt" /> 
not -->  <add key="MyFileLocation" value="c:\inetpub\wwwroot\foo\content\data\MyDataFile.txt" /> 
     </appSettings> 
  • Я не хочу, C# библиотеки для знать о веб-приложении, в котором он используется, поскольку он используется в другом программном обеспечении, и веб-приложение не нуждается в информации о конфигурации C# libra поэтому я действительно не хочу передавать конфигурационную информацию между слоями, если это возможно.

Любые предложения о том, как я могу сделать это чисто? Благодаря!

ответ

23

Вы можете использовать Path.Combine, чтобы комбинировать AppDomain.CurrentDomain.BaseDirectory и ваш относительный путь.

Это даст вам путь относительно корневого каталога ASP.NET (~ /) в приложении ASP.NET или путь к каталогу, содержащему исполняемый файл в приложении WinForms или консоли.

+0

Только что открыл это, но я дам вам очки! Конечно, работает в моем случае (и в консольном приложении я постучал в тест). Любая идея, если есть какие-либо случаи, это провалится? Благодарю. –

-1

если вы

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

это будет по отношению к исполняющему месту сборки.

+6

Который в случае веб-приложения обычно может быть файлом 'c: \ Windows \ Microsoft.NET \ Framework64 \ v4.0.30319 \ Temporary ASP.NET', который почти всегда _not_, что вы хотите. –

+1

-1 - это неправильно, это будет относиться к текущему рабочему каталогу - может быть% WINDIR% \ system32 \ inetsrv, если он запущен под IIS или каталогом, содержащим веб-сервер Cassini, если он работает в Visual Studio. Как правило, не рекомендуется делать предположения о текущем рабочем каталоге. – Joe

4

Почему бы вам не проверить веб-приложение на путь из файла конфигурации, разрешить его с помощью Server.MapPath, а затем передать полученный путь в библиотеку классов?


На основании вашего комментария у меня есть другое предложение: не используйте относительные пути.

+0

Да, я подумал об этом, но не хотел этого делать, поскольку это уменьшает разделение проблем в моем приложении; это потребует, чтобы мое веб-приложение участвовало в настройке библиотеки (к которой обращаются через интерфейсы, поэтому их можно поменять позже). –

+0

@Tim: ваше веб-приложение уже отвечает за конфигурацию тем фактом, что значения конфигурации хранятся на самом веб-сайте. Далее веб-приложение, по-видимому, называет сборку (в конце концов, она не одинока). Это неправильная «забота» о том, чтобы «отделять». – NotMe

+0

@Chris: настройки для всех сборок, вызываемые веб-приложением, хранятся в файле web.config. Так работает .NET - только один файл конфигурации для AppDomain. Для него разумно не проходить путь к библиотеке, поскольку разные библиотеки могут иметь разные пути или другую конфигурацию. –

0

Например

В вашем web.config

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

и в коде позади .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

Вы также можете сделать это:

В сети. config:

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

В коде:

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

Результат будет давать что-то вроде: "C: \ yourproj \ Содержание \ dataMyDataFile" или что-то в этом роде.

Смежные вопросы