2016-03-07 20 views
13

Mam rozwiązanie MVC ASP.NET Core (1.0-rc1-final) MVC i chcę przechowywać prosty plik tekstowy w projekcie, który zawiera listę napisów, które przeczytałem w tablica ciągów w moim kontrolerze.Przeczytaj pliki danych rozwiązania ASP.Net Core

Gdzie powinienem przechowywać ten plik w moim projekcie i jak mogę odczytać te pliki w kontrolerach?

w ASP.NET 4.x bym używany folder app_data i zrobić coś takiego

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

Ale Server.MapPath nie wydaje się być ważne w ASP.Net Rdzeń 1 i nie jestem pewien, że folder app_data jest albo.

Odpowiedz

13

Znalazłem proste rozwiązanie tego problemu.

Po pierwsze, możesz utworzyć folder w dowolnym miejscu swojego rozwiązania, nie musisz trzymać się konwencji, takich jak "app_data" z .net 4.x.

W moim scenariuszu Stworzyłem folder o nazwie „dane” u podstaw mojego projektu, mogę umieścić mój plik txt tam i używany ten kod odczytać zawartość do tablicy ciągów

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

+0

To nie działa dla ja w moim komputerze, ponieważ pomija folder projektu. I. e .: Musi to być "D: \ SOLUTION_FOLDER \ PROJECT_FOLDER \ data \ Owners.txt" i próbuje odczytać z "D: \ SOLUTION_FOLDER \ data \ Owners.txt" – Porkopek

10

w kontrolerze można wziąć zależność od środowiska IApplicationEnvironment i wstawić je do konstruktora, a następnie użyć go do ustalenia ścieżki do pliku, aby plik mógł żyć w folderze w projekcie. W poniższym przykładzie „env” jest instancją 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 reprezentuje applicationRootFolder

do wiadomości, że istnieje również IHostingEnvironment tam który ma znaną metodę .MapPath, ale jest na rzeczy przechowywanych poniżej wwwroot teczka. Powinieneś przechowywać rzeczy pod folderem wwwroot, który chcesz wyświetlać z żądaniami http, więc lepiej zachować listę napisów w innym folderze.

+0

Dziękuję za odpowiedź, ale znalazłem prostszą metodę, którą zamieściłem i zaznaczę jako odpowiedź. Dzięki jednak –

+0

Podałem poprawną odpowiedź, tylko dlatego, że nie jest to dokładna składnia wybrana w końcu nie jest doskonałym powodem, aby nie przyjąć mojej odpowiedzi imho. Również twoja odpowiedź, jeśli się nie mylę, będzie poprawna tylko w systemie plików Windows. –

+0

OK, widzę twoją sprawę, że twoje rozwiązanie będzie oparte na różnych platformach, a przez to lepsze - dało ci odpowiedź, dzięki –

3

IApplicationEnvironment i IRuntimeEnvironment zostały usunięte z announcement on github w dniu 2016/04/26.

Wymieniłem @ kodu JoeAudette za ten

private readonly string pathToFile; 

public UsersController(IHostingEnvironment env) 
{ 
    pathToFile = env.ContentRootPath 
     + Path.DirectorySeparatorChar.ToString() 
     + "Data" 
     + Path.DirectorySeparatorChar.ToString() 
     + "users.json"; 
} 

Gdzie mój plik .json znajduje się w src/WebApplication/Data/users.json

I potem czytać/analizować te dane, podobnie jak

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

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

    return await Task.Factory.StartNew(() => JsonConvert.DeserializeObject<IEnumerable<User>>(source)); 
} 
2

Metoda ta pracowała mnie lokalnie i na środowisku Azure.Pochodzi ona z odpowiedzią Joego powyżej

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; 
    } 

I tak powoływać tę metodę

string emailContent = ReadFile("./wwwroot/EmailTemplates/UpdateDetails.html"); 
5

można uzyskać otoczenie z Dependency Injection w kontrolerze:

using Microsoft.AspNetCore.Hosting; 
.... 

public class HomeController: Controller 
{ 
    private IHostingEnvironment _env; 

    public HomeController(IHostingEnvironment env) 
    { 
    _env = env; 
    } 
... 

Następnie można pobierz lokalizację wwwroot w swoich działaniach: _env.WebRootPath

var owners = System.IO.File.ReadAllLines(System.IO.Path.Combine(_env.WebRootPath,"File.txt")); 
0

To zawsze działało dla mnie lokalnie i na IIS.

AppDomain.CurrentDomain.BaseDirectory