web-dev-qa-db-ja.com

ASP.NET CoreのIFormFileからテキストファイルの行をメモリに読み込む方法は?

このアクションがあるとしましょう:

public List<string> Index(IFormFile file){

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

ファイルをドライブに保存する多くの例を見つけましたが、代わりにこれをスキップして、テキストの行をIFormFileから直接メモリの配列に読み込む場合はどうでしょうか。

22
MetaGuru

IFormFileの抽象化には .OpenReadStream メソッド。大量の望ましくない潜在的に大きな割り当てを防ぐには、一度に1行ずつ読み取り、読み取った各行からリストを作成する必要があります。さらに、このロジックを拡張メソッドにカプセル化できます。 Indexアクションは次のようになります。

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

対応する拡張メソッドは次のようになります。

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

同様に、asyncバージョンも使用できます。

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

次に、このバージョンを次のように使用できます。

public Task<List<string>> Index(IFormFile file) => file.ReadAsListAsync();
34
David Pine