記事内にはプロモーションが含まれています

【C#】テキストファイルへ出力・書き込みする方法

【C#】テキストファイルへ出力・書き込みする方法 C#

C#でアプリケーションを開発していると、処理のログを残したり、ユーザーの設定データを保存したり、CSVデータを作成したりと、「テキストファイルに文字を出力(書き込み)したい」場面は頻繁に訪れます。

C#にはファイル操作を行うための便利なクラスが標準で用意されていますが、「手軽に一行で書き込む方法」と「大量のデータを効率よく書き込む方法」があり、状況に応じて使い分ける必要があります。

また、日本語環境では「文字コード(UTF-8やShift-JIS)」の指定も避けては通れない課題です。

この記事では、C#におけるテキストファイル出力の基本である File クラスと StreamWriter クラスの使い方から、追記・上書きの制御、文字コードの指定方法、さらには最新の非同期書き込みまで、サンプルコード付きで徹底解説します。

【本記事の信頼性】
プロフィール
執筆者:マヒロ
  • 執筆者は元エンジニア
  • SES⇒大手の社内SE⇒独立
  • 現在はこじんまりとしたプログラミングスクールを運営
  • モットーは「利他の精神」

手軽に書き込むなら System.IO.File クラス

「とりあえず変数の内容をファイルに保存したい」「設定ファイルをサクッと作りたい」といったシンプルな用途であれば、System.IO.File クラスの静的メソッドを使うのが最も簡単で推奨されます。

ファイルを開く、書き込む、閉じるといった一連の処理を、たった1行のコードで行ってくれるからです。

ファイルを新規作成して書き込む(WriteAllText)

ファイルが存在しない場合は新規作成し、存在する場合は中身を上書きして保存するには WriteAllText メソッドを使います。

using System;
using System.IO; // 必須

class Program
{
    static void Main()
    {
        string filePath = @"C:\data\output.txt";
        string content = "こんにちは、C#の世界!\nこれはFileクラスを使った書き込みです。";

        try
        {
            // パスと内容を指定して書き込む(上書きモード)
            File.WriteAllText(filePath, content);
            
            Console.WriteLine("書き込みが完了しました。");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"エラーが発生しました: {ex.Message}");
        }
    }
}

File.WriteAllText(パス, 内容) を呼び出すだけで、指定したパスにテキストファイルが作成されます。

もし同じ名前のファイルが既にあった場合、以前の内容はすべて消えて新しい内容で上書きされる点に注意してください。

パスの指定には @(逐語的文字列リテラル)を使うと、円記号 \ をエスケープせずに書けるため便利です。

既存のファイルに追記する(AppendAllText)

ログファイルのように、既存のファイルの内容を消さずに、末尾に新しい行を追記(アペンド)したい場合は AppendAllText メソッドを使います。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string filePath = "log.txt"; // 相対パス(実行ファイルと同じ場所)
        string logMessage = $"{DateTime.Now}: 処理を実行しました。\n";

        // ファイルの末尾に追記する(ファイルがなければ新規作成)
        File.AppendAllText(filePath, logMessage);

        Console.WriteLine("ログを追記しました。");
    }
}

File.AppendAllText は、指定したファイルが存在すればその末尾にテキストを追加し、存在しなければ新規作成します。
実行するたびにファイルの中身が増えていくため、ログの記録などに最適です。

配列やリストを1行ずつ書き込む(WriteAllLines)

List<string> や配列に格納されたデータを、そのまま1行ずつファイルに出力したい場合は WriteAllLines が便利です。
ループ処理を書く必要がありません。

using System;
using System.IO;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        string filePath = "members.txt";
        
        var lines = new List<string>
        {
            "田中 太郎",
            "鈴木 次郎",
            "佐藤 花子"
        };

        // リストの各要素を1行ずつ書き込む
        File.WriteAllLines(filePath, lines);
    }
}

効率的に制御するなら StreamWriter クラス

数万行を超えるような大量のテキストを書き込む場合や、書き込み処理を細かく制御したい場合は、System.IO.StreamWriter クラスを使用します。

File クラスのメソッドは便利ですが、一度にすべてのテキストをメモリに展開するため、巨大なデータを扱うのには向きません。

StreamWriter ならば、ストリーム(流れ)として少しずつデータを書き込むことができます。

usingを使った基本的な書き込み

StreamWriter を使う際は、ファイルを開きっぱなしにしないよう、処理が終わったら必ず Close(または Dispose)する必要があります。

C#では using ステートメント(または宣言)を使うことで、これを自動化するのが定石です。

using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        string filePath = "stream_output.txt";

        // using宣言(C# 8.0以降)を使ってStreamWriterを生成
        // 第2引数の false は「上書きモード」を意味する(trueなら追記)
        // 第3引数で文字コードを指定(UTF-8)
        using StreamWriter writer = new StreamWriter(filePath, false, Encoding.UTF8);

        writer.WriteLine("1行目のデータ");
        writer.Write("2行目の");
        writer.WriteLine("続きです。");
        
        for (int i = 0; i < 5; i++)
        {
            writer.WriteLine($"ループ書き込み: {i}");
        }
        
        // ブロックを抜けると自動的にファイルが閉じられる
    }
}

ソースコードの解説

  • new StreamWriter(パス, appendフラグ, エンコーディング) コンストラクタで詳細な設定を行います。 第2引数を false にすると上書き(新規作成)true にすると追記モードになります。
  • writer.WriteLine() 文字列の末尾に改行コードを付けて書き込みます。
  • writer.Write() 改行せずに文字列を書き込みます。
  • using 宣言 using 変数型 変数名 = ...; と書くことで、その変数のスコープ(この場合はMainメソッド)を抜けた時点で自動的に Dispose() が呼ばれ、ファイルが適切に閉じられます。ファイルロックの問題を防ぐためにも必須の記述です。

文字コードを指定して出力する方法

C#(.NET)のデフォルト文字コードは UTF-8(BOMなし) です。

しかし、Excelで開くためのCSVファイルや、古いシステムと連携するファイルを作成する場合、Shift-JISUTF-8(BOMあり) を指定しなければならないことがあります。

UTF-8(BOMあり)で出力する

BOM(Byte Order Mark)付きのUTF-8にするには、Encoding.UTF8 をそのまま使います。
(実は .NET の Encoding.UTF8 はデフォルトでBOM付きを返す場合がありますが、明示的に指定する場合は以下のようにします)

// BOM付きUTF-8を指定
Encoding bomUtf8 = new UTF8Encoding(true);

using StreamWriter writer = new StreamWriter("bom_file.txt", false, bomUtf8);
writer.WriteLine("BOM付きで保存されました。");

Shift-JISで出力する(注意点あり)

.NET Core(.NET 5/6/7/8…)以降では、Shift-JISは標準ではサポートされていません。
使用するには準備が必要です。

  1. NuGetで System.Text.Encoding.CodePages パッケージをインストールする。
  2. プログラムの最初でプロバイダーを登録する。
using System;
using System.IO;
using System.Text;

class Program
{
    static void Main()
    {
        // 1. Shift-JISを使えるようにプロバイダーを登録(アプリ起動時に1回だけ実行)
        Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);

        // 2. Shift-JISのエンコーディングを取得
        Encoding sjis = Encoding.GetEncoding("Shift_JIS");

        string filePath = "sjis_output.txt";

        // Shift-JISを指定して書き込み
        using StreamWriter writer = new StreamWriter(filePath, false, sjis);
        
        writer.WriteLine("日本語のShift-JISファイルです。");
        writer.WriteLine("Windowsの古いメモ帳やExcelでも文字化けしません。");
    }
}

Encoding.GetEncoding("Shift_JIS") を使うために、Encoding.RegisterProvider の行が必須です。
これを忘れると実行時にエラーになります。

この設定を行えば、StreamWriter だけでなく File.WriteAllText などでも第3引数に sjis を渡すことでShift-JIS出力が可能になります。

非同期でファイルを書き込む(WriteAllTextAsync)

GUIアプリ(WPFやWindows Forms)やWebアプリ(ASP.NET Core)では、大きなファイルの書き込み中に画面がフリーズするのを防ぐため、非同期処理を行うのがモダンな実装です。

using System;
using System.IO;
using System.Threading.Tasks;

class Program
{
    static async Task Main()
    {
        string filePath = "async_data.txt";
        string content = "非同期で書き込んでいます...";

        Console.WriteLine("書き込み開始");

        // await を付けて非同期メソッドを呼び出す
        await File.WriteAllTextAsync(filePath, content);

        Console.WriteLine("書き込み終了");
    }
}

メソッド名に Async が付いた WriteAllTextAsyncAppendAllTextAsync を使用し、await キーワードを付けて呼び出します。

これにより、ファイルの書き込み(I/O処理)を待っている間も、スレッドをブロックせずに他の処理(UIの描画など)を続けることができます。

C#のスキルを活かして年収を上げる方法

以上、C#でテキストファイルへ出力・書き込みする方法を中心に解説してきました。

なお、C#のスキルがある場合には、「転職して年収をアップさせる」「副業で稼ぐ」といった方法を検討するのがおすすめです。

業務システム開発やアプリ開発、ゲーム開発において需要の高いC#を扱えるエンジニアは、転職によって数十万円の年収アップはザラで、100万円以上年収が上がることも珍しくありません。

なお、転職によって年収を上げたい場合は、エンジニア専門の転職エージェントサービスを利用するのが最適です。

今すぐ転職する気がなくとも、とりあえず転職エージェントに無料登録しておくだけで、スカウトが届いたり、思わぬ好待遇の求人情報が送られてきたりするというメリットがあります。

併せて、副業案件を獲得できるエージェントにも登録しておくと、空いている時間を活かして稼げるようなC#の案件を探しやすくなります。

転職エージェントも副業エージェントも、登録・利用は完全無料なので、どんな求人や副業案件があるのか気になる方は、気軽に利用してみるとよいでしょう。

C#
スポンサーリンク
code-izumiをフォローする