Мой проект имеет структуру папок в размере:
На сервере (в папке проекта/сервера) я отношу к папке такой:
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 в конструкторе или просто попросите ключ от конфигурации.
в
public Startup(IConfiguration configuration, IHostingEnvironment env)
{
var contentRoot = env.ContentRootPath;
}
в
public Startup(IConfiguration configuration)
{
var contentRoot = configuration.GetValue<string>(WebHostDefaults.ContentRootKey);
}
Работа на .Чистая ядра 2.2 и 3.0, как сейчас.
Чтобы получить корневой проекты каталог в контроллер:
частная чтения IHostingEnvironment _hostingEnvironment;
с помощью Microsoft.AspNetCore.Хостинг;
общественные HomeController(IHostingEnvironment hostingEnvironment) { _hostingEnvironment = hostingEnvironment; }
строки projectRootPath = _hostingEnvironment.ContentRootPath;
Чтобы попасть в "wwwroot в" по пути, используйте
_hostingEnvironment.WebRootPath
Как уже ответил (и убирается). Чтобы получить база справочник, как в месте сборки, Дон'т использовать каталог.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()) //<== The mistake
.UseIISIntegration()
.UseStartup<Program>()
.Build();
host.Run();
}
Теперь он работает правильно - теперь я могу перейти к вложенные папки из моих проектов корень с:
var pathToData = Path.GetFullPath(Path.Combine(projectRootFolder, "data"));
Я понял свою ошибку, прочитав BaseDirectory и текущий каталог и @CodeNotFound основывает ответа (который был отменен, потому что это не'т работу, потому что выше ошибка), которые в принципе могут быть найдены здесь: получаю от Webroot путь и содержимое корневого каталога в Asp.net ядро
В некоторых случаях _hostingEnvironment.И система ContentRootPath``.ИО.Каталог.GetCurrentDirectory()
целевых показателей к исходному каталогу. Вот это ошибка об этом.
Решение, предложенное там мне помогли
Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Попробуйте посмотреть здесь: https://stackoverflow.com/questions/6041332/best-way-to-get-application-folder-path
Цитата оттуда:
система
.ИО.Каталог.GetCurrentDirectory()
возвращает текущую каталог, который может или не может быть в папке, где применение расположенном. То же самое касается и окружающей среды.Текущей каталог. В случае, если вы с помощью этого DLL-файл, он будет возвращать путь, где процесс запущен (это особенно актуально в ASP.NET).
Я решил проблему с этим кодом:
using System.IO;
var path = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location.Substring(0, Assembly.GetEntryAssembly().Location.IndexOf("bin\\")))
Если вы используете ASP.NET в MVC сердечник 3 или новее, IHostingEnvironment
является устаревшим и заменен IWebHostEnvironment
public Startup(IWebHostEnvironment webHostEnvironment)
{
var webRootPath = webHostEnvironment.WebRootPath;
}
Это, кажется, IHostingEnvironment был заменен IHostEnvironment (и некоторые другие). Вы должны быть в состоянии изменить тип интерфейса В вашем коде и все будет работать как раньше :-)
вы можете найти более подробную информацию об изменениях по этой ссылке на GitHub https://github.com/aspnet/AspNetCore/issues/7749
редактирование существует также дополнительная IWebHostEnvironment интерфейс, который может быть использован в базовых приложений ASP.NET . Это доступно в Майкрософт.AspNetCore.Таких имен.