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

C# 读取解决方案数据文件ASP.Net核心,c#,asp.net-core,asp.net-core-mvc,asp.net-core-1.0,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Core 1.0,我有一个ASP.NET Core(1.0-rc1-final)MVC解决方案,我希望在项目中存储一个简单的文本文件,其中包含我读入控制器中字符串数组的字符串列表 我应该将此文件存储在项目中的何处,以及如何在控制器中读取这些文件 在ASP.NET4.x中,我会使用app\u data文件夹并执行类似操作 string path = Server.MapPath("~/App_Data/File.txt"); string[] lines = System.IO.File.ReadAllLines(

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

我应该将此文件存储在项目中的何处,以及如何在控制器中读取这些文件

在ASP.NET4.x中,我会使用
app\u data
文件夹并执行类似操作

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

但是
Server.MapPath
在ASP.Net Core 1中似乎无效,我也不确定
app\u 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


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

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

首先,您可以在解决方案中的任何位置创建文件夹,而不必遵守.net 4.x中的“应用程序数据”等约定

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


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

IApplicationEnvironment
IRuntimeEnvironment
自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 = File.OpenText(pathToFile))
    {
        source = await SourceReader.ReadToEndAsync();
    }

    return await Task.FromResult(JsonConvert.DeserializeObject<IEnumerable<User>>(source)));
}
private异步任务GetDataSet()
{
字符串源=”;
使用(StreamReader SourceReader=File.OpenText(pathToFile))
{
source=等待SourceReader.ReadToEndAsync();
}
返回wait Task.FromResult(JsonConvert.DeserializeObject(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"))

谢谢你的回复,但我发现了一个更简单的方法,我已经发布了,并将其标记为答案。谢谢,虽然我给出了一个正确的答案,但仅仅因为它不是你最后选择的确切语法并不是不接受我的答案的一个很好的理由。如果我没有弄错的话,您的答案也只有在windows文件系统上才是正确的。好的,我明白您的观点,您的解决方案将是跨平台的,因此更好-已经给了您答案,谢谢1。看起来IApplicationEnvironment现在已经死了。IHostingEnvironment似乎已经取代了它。2.Path.Combine()将使此解决方案更具吸引力:
var pathToFile=System.IO.Path.Combine(env.ContentRootPath,“yourfolder”,“yourfilename.txt”)这在我的计算机中不起作用,因为它跳过了项目文件夹。即:它需要是“D:\SOLUTION\u FOLDER\PROJECT\u FOLDER\data\Owners.txt”,并尝试从“D:\SOLUTION\u FOLDER\data\Owners.txt”读取您最好的选择是始终使用.NET Core 3.0 IHostingEnvironment是obslolete,应该由iWebHostenEnvironment替换为什么_env.WebRootPath为null?@carbitkicker…您可能没有注册依赖项现在IHostingEnvironment是obslolete,应该由iWebHostenEnvironment替换这也适用于我的Raspberry Pi使用dotnet Core我想应该是File.OpenText(pathToFile),而不仅仅是OpenText(pathToFile)