Чтение файлов данных решения 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"))