读取解决方案数据文件 ASP.Net 核心

Read solution data files ASP.Net Core

我有一个 ASP.NET Core (1.0-rc1-final) MVC 解决方案,我希望在项目中存储一个简单的文本文件,其中包含一个字符串列表,我将其读入我的字符串数组控制器。

我应该将此文件存储在我的项目中的什么位置以及如何在我的控制器中读取这些文件?

在 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 文件夹是否有效。

在您的控制器中,您可以依赖 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

请注意,还存在具有熟悉的 .MapPath 方法的 IHostingEnvironment,但它用于存储在 wwwroot 文件夹下的内容。您应该只将要为 http 请求提供服务的内容存储在 wwwroot 文件夹下,因此最好将字符串列表保存在不同的文件夹中。

我找到了一个简单的解决方案。

首先,您可以在解决方案中的任何位置创建一个文件夹,而不必遵循 .net 4.x 中的 'app_data' 等约定。

在我的方案中,我在项目的根目录下创建了一个名为 'data' 的文件夹,我将我的 txt 文件放在那里并使用此代码将内容读取到字符串数组

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

IApplicationEnvironmentIRuntimeEnvironment 已于 2016 年 4 月 26 日 announcement on github 删除。

我用这个替换了@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

然后我read/parse这个数据就这样

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

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

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

此方法在本地和 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");

您可以在控制器中使用依赖注入获取环境:

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

这对我在本地和 IIS 上一直有效。

AppDomain.CurrentDomain.BaseDirectory

要访问您的文件,您只需执行以下操作:

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