Подтвердить что ты не робот

Указание относительного расположения файла в web.config для использования стандартной библиотекой классов С#

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

Библиотека С# использует стандартные методы 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>
  • Я не хочу, чтобы библиотека С# знала веб-приложение, в котором оно используется, поскольку оно используется в другом программном обеспечении, и веб-приложение не нуждается в знании о конфигурации библиотеки С#, поэтому я не хочу 'действительно не хочу передавать конфигурационную информацию между слоями, если это возможно.

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

4b9b3361

Ответ 1

Вы можете использовать Path.Combine для объединения AppDomain.CurrentDomain.BaseDirectory и вашего относительного пути.

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

Ответ 2

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


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

Ответ 3

Например

В вашем 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();

Ответ 4

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

В web.config:

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

В вашем коде:

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

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

Ответ 5

если вы делаете

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

он будет относиться к месту сборки выполнения.