Чтение файлов данных решения ASP.Net Core
У меня есть MVC-решение ASP.NET Core (1.0-rc1-final), и я хочу сохранить простой текстовый файл в проекте, который содержит список строк, которые я читал в строковый массив моего контроллера.
Где я должен хранить этот файл в своем проекте и как я могу прочитать эти файлы в моих контроллерах?
В ASP.net 4.x я бы использовал папку app_data
и сделал что-то вроде этого
string path = Server.MapPath("~/App_Data/File.txt");
string[] lines = System.IO.File.ReadAllLines(path);
Но Server.MapPath
не кажется действительным в ASP.Net Core 1, и я не уверен, что папка app_data
также.
Ответы
Ответ 1
Я нашел простое решение.
Во-первых, вы можете создать папку в любом месте вашего решения, вам не нужно придерживаться таких условностей, как "app_data" из.net 4.x.
В моем сценарии я создал папку "данные" в корне моего проекта, я поместил там свой txt файл и использовал этот код для чтения содержимого в массив строк
var owners = System.IO.File.ReadAllLines(@"..\data\Owners.txt");
Ответ 2
в вашем контроллере вы можете зависеть от IApplicationEnvironment и внести его в конструктор, тогда вы можете использовать его для определения пути к вашему файлу, чтобы ваш файл мог жить в папке внутри проекта. В приведенном ниже примере "env" - это экземпляр IApplicationEnvironment
using Microsoft.Extensions.PlatformAbstractions;
var pathToFile = env.ApplicationBasePath
+ Path.DirectorySeparatorChar.ToString()
+ "yourfolder"
+ Path.DirectorySeparatorChar.ToString()
+ "yourfilename.txt";
string fileContent;
using (StreamReader reader = File.OpenText(pathToFile))
{
fileContent = reader.ReadToEnd();
}
ApplicationBasePath представляет applicationRootFolder
обратите внимание, что существует также и IHostingEnvironment, у которой есть знакомый метод.MapPath, но он предназначен для вещей, хранящихся под папкой wwwroot. Вы должны хранить вещи только под папкой wwwroot, которые вы хотите обслуживать с помощью HTTP-запросов, поэтому лучше сохранить список строк в другой папке.
Ответ 3
Вы можете получить среду с Injection Dependency в своем контроллере:
using Microsoft.AspNetCore.Hosting;
....
public class HomeController: Controller
{
private IHostingEnvironment _env;
public HomeController(IHostingEnvironment env)
{
_env = env;
}
...
Затем вы можете получить расположение wwwroot в своих действиях: _env.WebRootPath
var owners = System.IO.File.ReadAllLines(System.IO.Path.Combine(_env.WebRootPath,"File.txt"));
Ответ 4
IApplicationEnvironment
и IRuntimeEnvironment
были удалены с момента объявления о github в 2016/04/26.
Я заменил код @JoeAudette этим
private readonly string pathToFile;
public UsersController(IHostingEnvironment env)
{
pathToFile = env.ContentRootPath
+ Path.DirectorySeparatorChar.ToString()
+ "Data"
+ Path.DirectorySeparatorChar.ToString()
+ "users.json";
}
Где мой .json
файл находится в src/WebApplication/Data/users.json
Затем я читаю/разбираю эти данные так
private async Task<IEnumerable<User>> GetDataSet()
{
string source = "";
using (StreamReader SourceReader = OpenText(pathToFile))
{
source = await SourceReader.ReadToEndAsync();
}
return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<IEnumerable<User>>(source));
}
Ответ 5
Этот метод работал для меня локально и в среде Azure. Это взято из ответа Джо выше
public static string ReadFile(string FileName)
{
try
{
using (StreamReader reader = File.OpenText(FileName))
{
string fileContent = reader.ReadToEnd();
if (fileContent != null && fileContent != "")
{
return fileContent;
}
}
}
catch (Exception ex)
{
//Log
throw ex;
}
return null;
}
И так вызывается этот метод
string emailContent = ReadFile("./wwwroot/EmailTemplates/UpdateDetails.html");
Ответ 6
Это всегда работало для меня локально и на IIS.
AppDomain.CurrentDomain.BaseDirectory
Чтобы получить доступ к вашему файлу, вы можете просто сделать следующее:
import System.IO
...
var owners = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "File.txt"))