Caution

お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。

C#辞典

  1. トップページ
  2. C#辞典
  3. StreamReader / StreamWriter

StreamReader / StreamWriter

ファイルを行単位で読み込む『StreamReader』と、行単位で書き込む『StreamWriter』の使い方です。大容量ファイルをメモリに全展開せずに処理できます。

構文
using System.IO;

// StreamReader でファイルを読み込みます(using で自動的に Close() されます)。
using StreamReader reader = new StreamReader(string path);
using StreamReader reader = new StreamReader(string path, Encoding encoding);

// 1行読み込みます(ファイル末尾では null を返します)。
string? 行 = reader.ReadLine();

// 残り全部を string で読み込みます。
string 全内容 = reader.ReadToEnd();

// StreamWriter でファイルに書き込みます。
using StreamWriter writer = new StreamWriter(string path);

// 追記モードで開きます(false で上書き)。
using StreamWriter writer = new StreamWriter(string path, bool append);

// 1行書き込みます(改行付き)。
writer.WriteLine(string value);

// 改行なしで書き込みます。
writer.Write(string value);
メソッド一覧
メソッド / プロパティ概要
new StreamReader(path)指定したファイルを読み込みモードで開きます。デフォルト文字コードは UTF-8 です。
ReadLine()1 行読み込んで返します。ファイルの末尾に達すると null を返します。
ReadToEnd()現在位置からファイル末尾まですべての内容を string として返します。
EndOfStreamストリームの末尾に達した場合に true を返すプロパティです。
new StreamWriter(path)指定したファイルを書き込みモードで開きます(既存ファイルは上書き)。
new StreamWriter(path, append)append が true の場合は追記モード、false の場合は上書きモードで開きます。
WriteLine(value)value を書き込んだあと改行します。
Write(value)改行なしで value を書き込みます。
サンプルコード
using System;
using System.IO;
using System.Text;

string ファイルパス = "log.txt";

// StreamWriter でファイルを作成して書き込みます。
using (StreamWriter writer = new StreamWriter(ファイルパス, false, Encoding.UTF8))
{
    writer.WriteLine("1行目: ログ開始");
    writer.WriteLine("2行目: 処理中");
    writer.WriteLine("3行目: 処理完了");
}
Console.WriteLine("書き込み完了");

// StreamReader で 1 行ずつ読み込みます。
Console.WriteLine("--- 全行読み込み ---");
using (StreamReader reader = new StreamReader(ファイルパス, Encoding.UTF8))
{
    string? 行;
    int 行番号 = 1;
    while ((行 = reader.ReadLine()) != null)
    {
        Console.WriteLine($"{行番号}: {行}");
        行番号++;
    }
}

// 追記モードで行を追加します。
using (StreamWriter writer = new StreamWriter(ファイルパス, append: true, Encoding.UTF8))
{
    writer.WriteLine("4行目: 追記しました");
}

// ReadToEnd() でまとめて読み込みます。
using (StreamReader reader = new StreamReader(ファイルパス, Encoding.UTF8))
{
    Console.WriteLine("--- ReadToEnd() ---");
    Console.WriteLine(reader.ReadToEnd());
}

// 後片付けとしてファイルを削除します。
File.Delete(ファイルパス);
概要

『StreamReader』と『StreamWriter』は必ず using ブロックで囲んでください。using を省略してファイルを閉じないと、他のプロセスがそのファイルにアクセスできなくなります。また、StreamWriter は内部バッファを持つため、using ブロックを抜けるとき(Dispose() 時)に自動的に Flush() が呼ばれてバッファの内容がファイルに書き出されます。

ファイル全体を一度に読み書きするシンプルなケースではFile.ReadAllText() / WriteAllText()の方が簡潔です。ファイルの存在確認や削除についてはFile.Exists() / Delete() / Copy()をご確認ください。

記事の間違いや著作権の侵害等ございましたらお手数ですがまでご連絡頂ければ幸いです。