C#でテキストファイルに書き込む

C#でテキストファイルへデータを書き込むには System.IO.StreamWriter クラスを使います。

ここでは基本的な StreamWriter クラスの使い方についてまとめてみます。

ファイルを開く

StreamWriterオブジェクトを生成すると、ファイルがオープンされてデータを書き込める状態になります。ファイルが無い場合は新たにファイルが作成されてからオープンします。

 

書き込むファイルの名前はコンストラクタの引数に渡します。

コンストラクタの2番目の引数に bool 値を渡すと、既にファイルがある場合の挙動を制御できます。

true を渡した場合、既存のデータの末尾に追加していくようになり、

false を渡した場合、既存のデータを全て消去してから書き込む事になります。

ファイルの文字エンコーディングも合わせてコンストラクタの引数に渡しましょう。 

 

※文字コード

テキストファイルに書かれる文字は文字コードと呼ばれるバイト表現と文字の対応表を使って保存されています。

保存時に使った文字コードと同じ文字コードで解釈して読み込まなければ漢字などが正しく読み込めない事があります。

    var fileName = @"c:\test.txt";
    var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

    var writer = new System.IO.StreamWriter(fileName, false, encoding);

ファイルへ書き込む

StreamWriter クラスの WriteLine() メソッドを使うと1行ずつ書き込んでいくことが出来ます。

WriteLine() メソッドは引数で渡した文字列に加えて改行記号もファイルに書き込みます。

            var fileName = @"c:\test.txt";
            var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

            var writer = new System.IO.StreamWriter(fileName, false, encoding);
            for (int i = 0; i < 10; ++i)
            {
                var record = string.Format("{0}", i);
                writer.WriteLine(record);
            }

ファイルを閉じる

ファイルは開いたら必ず閉じる必要があります。

ファイルを閉じるには StreamWriter クラスの Close() メソッドを呼び出します。

Close は finally で

ファイルの書き込み中に例外が発生する可能性がある事を必ず考慮してコードを書きましょう。

try ... finally ステートメントの finally ブロックで Close() を呼び出す事で例外発生時にも対応したコードを書くことが出来ます。

    var fileName = @"c:\test.txt";
    var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

    var writer = new System.IO.StreamWriter(fileName, false, encoding);
    try
    {
        for (int i = 0; i < 10; ++i)
        {
            var record = string.Format("{0}", i);
            writer.WriteLine(record);
        }
    }
    finally
    {
        writer.Close();
    }

Close の代わりに using を使う

StreamWriter クラスは IDisposable インターフェースをもっているので、Close() メソッドのかわりに using 構文を使う事も出来ます。

 

下記の例は、上の try … finally を使ったコードと全く同じ動きをします。

using ブロックを抜けた時点で(例外が起きる起きないにかかわらず)IDispposableインターフェースの Dispose() メソッドが呼ばれます。この Dispose() でファイルを閉じる処理が行われます。

    var fileName = @"c:\test.txt";
    var encoding = System.Text.Encoding.GetEncoding("SHIFT_JIS");

    using (var writer = new System.IO.StreamWriter(fileName, false, encoding))
    {
        for (int i = 0; i < 10; ++i)
        {
            var record = string.Format("{0}", i);
            writer.WriteLine(record);
        }
    }