2016-10-14 2 views
5

Скажет, у вас есть это Действие:Как читать в памяти строки текстового файла из IFormFile в ASP.NET Core?

public List<string> Index(IFormFile file){ 

    //extract list of strings from the file 
    return new List<string>(); 
} 

Я нашел много примеров сохранения файла на диск, но что, если вместо этого я хочу, чтобы пропустить это и просто прочитать строки текста в массив в памяти, непосредственно из IFormFile?

ответ

7

Вы должны быть в состоянии сделать следующее:

public List<string> Index(IFormFile file) 
{ 
    var result = string.Empty; 
    using (var reader = new StreamReader(file.OpenReadStream())) 
    { 
     result = reader.ReadToEnd(); 
    } 

    return string.IsNullOrEmpty(result) 
     ? null 
     : result.Split('\n').ToList(); 
} 

Абстракции для IFormFile имеет .OpenReadStream метод.

Update

Чтобы предотвратить тонну нежелательных и потенциально больших ассигнований, мы должны читать одну строку, в то время, и строить наш список из каждой строки таким образом. Кроме того, мы можем инкапсулировать эту логику в метод расширения. Index действие заканчивает тем, как это:

public List<string> Index(IFormFile file) => file.ReadAsList(); 

Соответствующий метод расширения выглядит следующим образом:

public static List<string> ReadAsList(this IFormFile file) 
{ 
    var result = new List<string>(); 
    using (var reader = new StreamReader(file.OpenReadStream())) 
    { 
     while (reader.Peek() >= 0) 
      result.Add(reader.ReadLine()); 
    } 
    return result; 
} 

Точно так же вы могли бы иметь async версию, а также:

public static async Task<List<string>> ReadAsListAsync(this IFormFile file) 
{ 
    var result = new List<string>(); 
    using (var reader = new StreamReader(file.OpenReadStream())) 
    { 
     while (reader.Peek() >= 0) 
      result.Add(await reader.ReadLineAsync()); 
    } 
    return result; 
} 

Тогда вам может использовать эту версию таким образом:

public Task<List<string>> Index(IFormFile file) => file.ReadAsListAsync(); 
:
+0

это работало, хотя оно не принимало Environment.NewLine, поэтому я использовал 'Split ('\ n')', что-то о желании char вместо строки – BigOmega

+1

Зачем вам читать все это в одну строку, тогда Split then Составить список? Почему бы просто не прочесть его по строкам и добавить в список? Вышеупомянутый код выделяет потенциально гигантскую строку, чтобы затем выделить массив, а затем распределяет список. – davidfowl

+0

Большое наблюдение. Я просто показывал, как это можно сделать, я обновляю код - спасибо. –

Смежные вопросы