web-dev-qa-db-fra.com

Lire les fichiers de données de la solution ASP.Net Core

J'ai une solution MVC ASP.NET Core (1.0-rc1-final) et je souhaite stocker un simple fichier texte dans le projet, qui contient une liste de chaînes que je lis dans un tableau de chaînes de mon contrôleur.

Où dois-je stocker ce fichier dans mon projet et comment lire ces fichiers dans mes contrôleurs?

Dans ASP.net 4.x, j'aurais utilisé le app_data dossier et fait quelque chose comme ça

string path = Server.MapPath("~/App_Data/File.txt");
string[] lines = System.IO.File.ReadAllLines(path);

Mais Server.MapPath ne semble pas être valide dans ASP.Net Core 1 et je ne suis pas sûr que le app_data dossier est soit.

29
Martin Kearn

J'ai trouvé une solution simple à cela.

Tout d'abord, vous pouvez créer un dossier n'importe où dans votre solution. Vous n'avez pas à vous en tenir aux conventions telles que 'app_data' à partir de .net 4.x.

Dans mon scénario, j'ai créé un dossier appelé "données" à la racine de mon projet, j'ai placé mon fichier txt là-bas et utilisé ce code pour lire le contenu dans un tableau de chaînes.

var owners = System.IO.File.ReadAllLines(@"..\data\Owners.txt");

26
Martin Kearn

dans votre contrôleur, vous pouvez créer une dépendance sur IApplicationEnvironment et l'injecter dans le constructeur. Vous pouvez ensuite l'utiliser pour établir le chemin d'accès à votre fichier afin que celui-ci puisse résider dans un dossier du projet. Dans l'exemple ci-dessous, "env" est l'instance de 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 représente le dossier applicationRootFolder.

notez qu'il existe également IHostingEnvironment, qui utilise la méthode .MapPath, bien connue, mais qui s'applique aux éléments stockés sous le dossier wwwroot. Vous ne devez stocker que les éléments situés sous le dossier wwwroot que vous souhaitez utiliser avec les demandes http. Il est donc préférable de conserver votre liste de chaînes dans un autre dossier.

12
Joe Audette

Vous pouvez obtenir l’environnement avec Dependency Injection dans votre contrôleur:

using Microsoft.AspNetCore.Hosting;
....

public class HomeController: Controller
{
   private IHostingEnvironment _env;

   public HomeController(IHostingEnvironment env)
   {
   _env = env;
   }   
...

Ensuite, vous pouvez obtenir l'emplacement wwwroot dans vos actions: _env.WebRootPath

var owners =   System.IO.File.ReadAllLines(System.IO.Path.Combine(_env.WebRootPath,"File.txt"));
10
Pieter van Kampen

IApplicationEnvironment et IRuntimeEnvironment ont été supprimés à compter du annonce sur github du 2016/04/26.

J'ai remplacé le code de @ JoeAudette par ceci

private readonly string pathToFile;

public UsersController(IHostingEnvironment env)
{
    pathToFile = env.ContentRootPath
       + Path.DirectorySeparatorChar.ToString()
       + "Data"
       + Path.DirectorySeparatorChar.ToString()
       + "users.json";
}

Où se trouve mon fichier .json À src/WebApplication/Data/users.json

J'ai ensuite lu/analysé ces données comme si

private async Task<IEnumerable<User>> GetDataSet()
{
    string source = "";

    using (StreamReader SourceReader = OpenText(pathToFile))
    {
        source = await SourceReader.ReadToEndAsync();
    }

    return await Task.FromResult(JsonConvert.DeserializeObject<IEnumerable<User>>(source)));
}
7
seangwright

Cela a toujours fonctionné pour moi localement et sur IIS.

AppDomain.CurrentDomain.BaseDirectory

Pour accéder à votre fichier, vous pouvez simplement procéder comme suit:

import System.IO
...
var owners = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "File.txt"))
3
zdub

Cette méthode a fonctionné pour moi localement et sur l'environnement Azure. Il est tiré de la réponse de Joe ci-dessus

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;
    }

Et voici comment invoqué cette méthode

string emailContent = ReadFile("./wwwroot/EmailTemplates/UpdateDetails.html");
3
Crennotech