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.
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");
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.
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"));
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)));
}
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"))
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");