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
フォルダーはいずれかです。
これに対する簡単な解決策を見つけました。
まず、ソリューションの任意の場所にフォルダーを作成できます。net4.xの「app_data」などの規則に固執する必要はありません。
私のシナリオでは、プロジェクトのルートに「data」というフォルダーを作成し、そこにtxtファイルを入れ、このコードを使用して内容を文字列配列に読み取りました
var owners = System.IO.File.ReadAllLines(@"..\data\Owners.txt");
コントローラーで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フォルダーの下のみに保存する必要があります。したがって、文字列のリストを別のフォルダーに保存することをお勧めします。
コントローラーで依存性注入を使用して環境を取得できます。
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"));
IApplicationEnvironment
とIRuntimeEnvironment
は、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)));
}
これは常にローカルおよびIISで機能しました。
AppDomain.CurrentDomain.BaseDirectory
ファイルにアクセスするには、次のことを行うだけです。
import System.IO
...
var owners = File.ReadAllLines(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "File.txt"))
この方法は、ローカルおよび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");