Как добраться в корневой каталог проекта asp.net ядро. Каталог.GetCurrentDirectory() не'т, кажется, правильно работать на Mac

Мой проект имеет структуру папок в размере:

  • Проект
  • Проект/сведения
  • Проект/Двигатель
  • Проект/Сервер
  • проект/фронтальный

На сервере (в папке проекта/сервера) я отношу к папке такой:

var rootFolder = Directory.GetCurrentDirectory();
rootFolder = rootFolder.Substring(0,
            rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length);
PathToData = Path.GetFullPath(Path.Combine(rootFolder, "Data"));

var Parser = Parser();
var d = new FileStream(Path.Combine(PathToData, $"{dataFileName}.txt"), FileMode.Open);
var fs = new StreamReader(d, Encoding.UTF8);

На моей машине Windows этот код работает нормально с каталога.GetCurrentDirectory()` сосланный в текущую папку, и делаю

rootFolder.Substring(0, rootFolder.IndexOf(@"\Project\", StringComparison.Ordinal) + @"\Project\".Length); 

получает меня в корневой папке проекта (не bin или отладка папки). Но когда я запустил его на компьютере Mac, он получил и" Каталог.GetCurrentDirectory()`" и послал меня в /usr/<имя пользователя>/[что-то еще]. Это не'т указать папку, где лежит мой проект.

Как правильно найти относительные пути в мой проект? Где я должен хранить папки с данными таким образом, что оно легко доступно для всех подпроектов в растворе - специально для проекта пустельга сервер? Я предпочитаю не хранить его в папке wwwroot, потому что в папке data поддерживается другой член команды, и я просто хочу, чтобы получить доступ к последней версии. Какие у меня варианты?

Решение

В зависимости от того, где вы находитесь в трубопроводе пустельга - если у вас есть доступ к IConfiguration (автозагрузки.конструктор ЗС) или IHostingEnvironment вы можете либо впрыснуть `IHostingEnvironment в конструкторе или просто попросите ключ от конфигурации.

IHostingEnvironment вложил в стартап.конструктор ЗС`

в

public Startup(IConfiguration configuration, IHostingEnvironment env)
{
     var contentRoot = env.ContentRootPath;
}

Используя IConfiguration в автозагрузку.в CS конструктор

в

public Startup(IConfiguration configuration)
{
     var contentRoot = configuration.GetValue(WebHostDefaults.ContentRootKey);
}
Комментарии (3)

Работа на .Чистая ядра 2.2 и 3.0, как сейчас.

Чтобы получить корневой проекты каталог в контроллер:

  • Создать свойство для таких условий

частная чтения IHostingEnvironment _hostingEnvironment;

  • Добавить Microsoft.AspNetCore.Хостинг для вашего контроллера

с помощью Microsoft.AspNetCore.Хостинг;

  • Зарегистрировать службу в конструкторе

общественные HomeController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; }

  • Теперь, чтобы получить проекты корневой путь

строки projectRootPath = _hostingEnvironment.ContentRootPath;

Чтобы попасть в "wwwroot в" по пути, используйте

_hostingEnvironment.WebRootPath
Комментарии (7)

Как уже ответил (и убирается). Чтобы получить база справочник, как в месте сборки, Дон'т использовать каталог.GetCurrentDirectory(), а получить его от IHostingEnvironment.ContentRootPath.

private IHostingEnvironment _hostingEnvironment;
    private string projectRootFolder;
    public Program(IHostingEnvironment env)
    {
        _hostingEnvironment = env;
        projectRootFolder = env.ContentRootPath.Substring(0,
            env.ContentRootPath.LastIndexOf(@"\ProjectRoot\", StringComparison.Ordinal) + @"\ProjectRoot\".Length);
    }

Однако я сделал еще ошибку: я поставил каталоге ContentRoot в каталог.GetCurrentDirectory() при запуске подрывает значение по умолчанию, которое я так хотел! Здесь я закомментировал ошибочную строку:


 public static void Main(string[] args)
    {
        var host = new WebHostBuilder().UseKestrel()
           // .UseContentRoot(Directory.GetCurrentDirectory()) //
Комментарии (1)

В некоторых случаях _hostingEnvironment.И система ContentRootPath``.ИО.Каталог.GetCurrentDirectory() целевых показателей к исходному каталогу. Вот это ошибка об этом.

Решение, предложенное там мне помогли

Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Комментарии (1)

Попробуйте посмотреть здесь: https://stackoverflow.com/questions/6041332/best-way-to-get-application-folder-path

Цитата оттуда:

система.ИО.Каталог.GetCurrentDirectory() возвращает текущую каталог, который может или не может быть в папке, где применение расположенном. То же самое касается и окружающей среды.Текущей каталог. В случае, если вы с помощью этого DLL-файл, он будет возвращать путь, где процесс запущен (это особенно актуально в ASP.NET).

Комментарии (0)

Я решил проблему с этим кодом:

using System.IO;

var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location.Substring(0, Assembly.GetEntryAssembly().Location.IndexOf("bin\\")))
Комментарии (0)

Если вы используете ASP.NET в MVC сердечник 3 или новее, IHostingEnvironment является устаревшим и заменен IWebHostEnvironment

public Startup(IWebHostEnvironment webHostEnvironment)
{
    var webRootPath = webHostEnvironment.WebRootPath;
}
Комментарии (0)

Это, кажется, IHostingEnvironment был заменен IHostEnvironment (и некоторые другие). Вы должны быть в состоянии изменить тип интерфейса В вашем коде и все будет работать как раньше :-)

вы можете найти более подробную информацию об изменениях по этой ссылке на GitHub https://github.com/aspnet/AspNetCore/issues/7749

редактирование существует также дополнительная IWebHostEnvironment интерфейс, который может быть использован в базовых приложений ASP.NET . Это доступно в Майкрософт.AspNetCore.Таких имен.

Реф: https://stackoverflow.com/a/55602187/932448

Комментарии (0)