2016-10-14 21 views
5

は、このアクションを持っていると言う:ASP.NETコアのIFormFileからテキストファイルの行をメモリに読み込む方法は?

public List<string> Index(IFormFile file){ 

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

私はドライブにファイルを保存する例をたくさん見つけたが、私は代わりに、これをスキップしてちょうどの配列にテキストの行を読み取るために何をしたい場合メモリ、直接IFormFileから?

答えて

7

次の操作を行うことができる必要があります:IFormFileため

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

抽象化は.OpenReadStream方法があります。潜在的に望ましくないと大きな割り当てのトンを防ぐため

更新

、我々は一度に一つのラインを読み、そのように各ラインからの私たちのリストを構築する必要があります。さらに、このロジックを拡張メソッドでカプセル化することもできます。

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 List<string> Index(IFormFile file) => file.ReadAsList(); 

Indexアクションは、このように見える終わりますこの方法でこの方法を使用できます:

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

Environment.NewLineを受け入れませんでしたので、 'Split( '\ n')'を使用しました。文字列の代わりにcharを使用する方法について – BigOmega

+1

なぜそれをすべて1つの文字列にしてからSplitリストを作る?なぜそれを行ごとに読んでリストに追加するのはなぜですか?上記のコードは、潜在的に巨大な文字列を割り当て、次に配列を割り当て、次にリストを割り当てます。 – davidfowl

+0

素晴らしい観察。私は単にそれができる方法を示していた、私はコードを更新する - ありがとう。 –

関連する問題