web-dev-qa-db-ja.com

ソリューションデータファイルの読み取り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フォルダーはいずれかです。

29
Martin Kearn

これに対する簡単な解決策を見つけました。

まず、ソリューションの任意の場所にフォルダーを作成できます。net4.xの「app_data」などの規則に固執する必要はありません。

私のシナリオでは、プロジェクトのルートに「data」というフォルダーを作成し、そこにtxtファイルを入れ、このコードを使用して内容を文字列配列に読み取りました

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

26
Martin Kearn

コントローラーで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フォルダーの下のみに保存する必要があります。したがって、文字列のリストを別のフォルダーに保存することをお勧めします。

12
Joe Audette

コントローラーで依存性注入を使用して環境を取得できます。

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

IApplicationEnvironmentIRuntimeEnvironmentは、2016/04/26の 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にある場所

次に、このデータを読み取り/解析します

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

これは常にローカルおよびIISで機能しました。

AppDomain.CurrentDomain.BaseDirectory

ファイルにアクセスするには、次のことを行うだけです。

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

この方法は、ローカルおよび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");
3
Crennotech