はい、承知いたしました。C#のStreamWriter
で追記・上書きする方法について、初心者向けに詳細な説明を含む約5000語の記事を作成します。
C#のStreamWriterで追記・上書きする方法【初心者向け完全ガイド】
はじめに:ファイル操作への第一歩
C#を使ってプログラミングを学び始めると、コンソールへの出力や変数での計算といった基本的な操作の次に、必ずと言っていいほど直面するのが「ファイル操作」です。プログラムの設定を保存したり、アプリケーションの動作ログを記録したり、ユーザーが作成したデータを永続化したりと、ファイル操作は現代のソフトウェア開発において不可欠な技術です。
C#には、このファイル操作を簡単かつ強力に行うための様々なクラスが用意されています。その中でも、テキストファイルへの書き込みにおいて中心的な役割を果たすのが StreamWriter
クラスです。
この記事では、C#プログラミングの初心者の方を対象に、StreamWriter
クラスの基本的な使い方から、特に重要な「上書き(Overwrite)」と「追記(Append)」の操作方法について、徹底的に解説していきます。
この記事を読み終える頃には、あなたは以下のことをマスターしているでしょう。
StreamWriter
を使って新しいテキストファイルを作成する方法- 既存のファイルの内容を完全に新しい内容で置き換える「上書き」の方法
- 既存のファイルの末尾に新しい内容を付け加える「追記」の方法
- 上書きと追記を正しく使い分けるための判断基準
- 日本語環境で特に重要な「文字コード」を指定して文字化けを防ぐ方法
- より簡潔にファイル操作を行うための
File
クラスとの連携 - 実践的な応用例(CSVファイルやログファイルの作成)
- パフォーマンスや非同期処理に関する少し進んだトピック
約5000語にわたる詳細な解説と豊富なコード例を通じて、あなたが自信を持ってC#でファイル操作を行えるようになることを目指します。それでは、StreamWriter
の世界へ一緒に踏み出しましょう!
1. StreamWriter
とは? なぜこれを使うのか?
まず、StreamWriter
が何者なのかを理解することから始めましょう。
StreamWriter
は、その名の通り「ストリーム(Stream)」に対してテキストデータを「書き込む(Write)」ためのクラスです。System.IO
という名前空間に属しており、C#でファイルI/O(Input/Output、入出力)を扱う際の基本となります。
ストリーム(Stream)という考え方
ここで言う「ストリーム」とは、データの流れを抽象化した概念です。川の流れをイメージしてください。データは川の水のように、一方向(プログラムからファイルへ、あるいはファイルからプログラムへ)に連続して流れていきます。
C#では、ファイル、ネットワーク接続、メモリ上のデータなど、様々なI/Oソースをこの「ストリーム」という統一されたモデルで扱います。StreamWriter
は、このデータの流れ(ストリーム)の上に乗り、私たちが扱いやすい「文字列」や「文字」という単位で、簡単にデータを流し込めるようにしてくれる便利な道具なのです。
技術的には、StreamWriter
は FileStream
のようなバイト(byte)単位でデータを扱う低レベルなストリームを内部でラップ(包み込み)しています。プログラマは面倒なバイト変換を意識することなく、「こんにちは」といった文字列をそのまま書き込むだけで、StreamWriter
が自動的に適切なバイトデータに変換してファイルに書き込んでくれるのです。
StreamWriter
を使うメリット
- 直感的:
Write()
やWriteLine()
といったメソッド名から分かるように、コンソールへの出力と同じような感覚でファイルに書き込みができます。 - 文字コード対応: テキストデータを扱う上で避けては通れない文字コード(エンコーディング)の指定が簡単に行え、文字化けのリスクを低減できます。
- バッファリング: データをある程度まとめてから一度に書き込む「バッファリング」という仕組みが内部で行われるため、パフォーマンスが向上します。
StreamWriter
は、C#でテキストファイルを扱う上でのデファクトスタンダードと言えるクラスです。その使い方をマスターすることは、C#プログラマとしての大きな一歩となります。
2. 基本の「き」:ファイルの新規作成と上書き
それでは、実際にコードを書きながら StreamWriter
の使い方を見ていきましょう。最も基本的な操作は、新しいファイルを作成し、そこにテキストを書き込むことです。これは、StreamWriter
のデフォルトの動作である「上書き」モードを利用します。
上書き(Overwrite)とは?
上書きとは、指定したファイルがすでに存在する場合、そのファイルの中身をすべて消去して、新しい内容で完全に置き換える動作を指します。もしファイルが存在しない場合は、新しくファイルが作成されます。
基本的なコード例
StreamWriter
の最もシンプルなコンストラクタ(クラスを初期化するためのメソッド)は、引数にファイルパス(ファイルの場所と名前)を一つだけ取ります。
“`csharp
// ファイルパスを定義
string filePath = @”C:\temp\MyTestFile.txt”;
// usingステートメントでStreamWriterをインスタンス化
// この書き方が「上書き」モードの基本形
using (StreamWriter writer = new StreamWriter(filePath))
{
// WriteLineメソッドは、文字列を書き込んだ後に改行を追加する
writer.WriteLine(“こんにちは、世界!”);
writer.WriteLine(“これはStreamWriterのテストです。”);
// Writeメソッドは、文字列をそのまま書き込む(改行なし)
writer.Write("1行目の一部。");
writer.Write("続けて書きます。");
writer.WriteLine(); // これで改行
int version = 1;
writer.WriteLine($"現在のバージョンは {version} です。");
} // usingブロックを抜けると、自動的にファイルが閉じられ、リソースが解放される
Console.WriteLine(“ファイルの書き込みが完了しました。”);
Console.WriteLine($”ファイルパス: {filePath}”);
“`
コードの解説
-
string filePath = @"C:\temp\MyTestFile.txt";
- 書き込むファイルのパスを文字列変数に格納しています。
@
を接頭辞につけることで、バックスラッシュ\
をエスケープシーケンスとしてではなく、文字そのものとして扱うことができます。 - 注意:
C:\temp
フォルダが存在しない場合、DirectoryNotFoundException
というエラーが発生します。実行前にフォルダを作成しておいてください。
- 書き込むファイルのパスを文字列変数に格納しています。
-
using (StreamWriter writer = new StreamWriter(filePath))
- これが
StreamWriter
を利用する上での黄金律です。using
ステートメントは、{}
のブロックを抜ける際に、writer
オブジェクトが持つDispose()
メソッドを自動的に呼び出してくれます。 Dispose()
は、ファイルハンドル(OSがファイルを管理するための識別子)の解放や、バッファに残っているデータのファイルへの書き込み(フラッシュ)など、後片付けをすべて行ってくれる重要な処理です。using
を使えば、この後片付けを忘れる心配がありません。
- これが
-
writer.WriteLine(...)
とwriter.Write(...)
WriteLine
は、文字列を書き込んだ後に改行コード(Windowsでは通常CRLF)を追加します。Console.WriteLine
と同じ感覚で使えます。Write
は、改行コードを追加せずに文字列だけを書き込みます。続けて何かを書きたい場合に使います。
実行結果
このプログラムを初めて実行すると、C:\temp
フォルダに MyTestFile.txt
という名前のファイルが作成され、その中身は以下のようになります。
txt
こんにちは、世界!
これはStreamWriterのテストです。
1行目の一部。続けて書きます。
現在のバージョンは 1 です。
上書き動作の確認
では、プログラムを少し変更して、もう一度実行してみましょう。
“`csharp
// (filePathの定義は同じ)
// 2回目の実行
using (StreamWriter writer = new StreamWriter(filePath))
{
writer.WriteLine(“これは2回目の実行です。”);
writer.WriteLine(“ファイルは上書きされました。”);
}
Console.WriteLine(“ファイルの書き込みが完了しました。”);
“`
この2回目のプログラムを実行した後、MyTestFile.txt
を開いてみてください。中身は以下のようになっているはずです。
txt
これは2回目の実行です。
ファイルは上書きされました。
最初の「こんにちは、世界!」から始まる内容は完全に消去され、新しい内容に置き換わりました。これが StreamWriter(filePath)
というシンプルなコンストラクタのデフォルト動作、「上書き」です。
3. 本題:ファイルへの追記(Append)
上書きの動作は理解できたでしょうか。次に、この記事の核心である「追記」の方法を学びます。
追記(Append)とは?
追記とは、指定したファイルがすでに存在する場合、そのファイルの中身は消さずに、ファイルの末尾に新しい内容を付け加える動作を指します。もしファイルが存在しない場合は、上書きモードと同様に、新しくファイルが作成されます。
アプリケーションのログを記録したり、CSVファイルに新しいデータを一行ずつ追加したりする場合など、追記は非常に多くの場面で利用されます。
追記モードを指定する方法
StreamWriter
で追記モードを利用するには、コンストラクタの2番目の引数 append
に true
を指定します。
public StreamWriter (string path, bool append);
path
: ファイルのパスappend
:true
を指定すると 追記モードfalse
を指定すると 上書きモード
引数を一つしか指定しない new StreamWriter(path)
は、内部的に new StreamWriter(path, false)
を呼び出しているのと同じ意味になります。
追記のコード例:ログファイルの作成
日時とともにイベントを記録する、簡単なログ出力プログラムを作成してみましょう。
“`csharp
// ログファイルのパス
string logFilePath = @”C:\temp\Application.log”;
// 追記モードでStreamWriterをインスタンス化
// コンストラクタの第二引数に true を指定するのがポイント!
using (StreamWriter writer = new StreamWriter(logFilePath, true))
{
// 現在の日時を取得
string timestamp = DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);
// ログメッセージを書き込む
writer.WriteLine($"[{timestamp}] アプリケーションが起動しました。");
}
Console.WriteLine(“ログを書き込みました。”);
Console.WriteLine($”ログファイル: {logFilePath}”);
“`
実行してみよう
-
1回目の実行後
Application.log
ファイルが新規作成され、以下の内容が書き込まれます。(日時は実行した時間になります)
txt
[2023-10-27 10:30:00] アプリケーションが起動しました。 -
プログラムを何も変更せず、もう一度実行
Application.log
を再度開いてみてください。txt
[2023-10-27 10:30:00] アプリケーションが起動しました。
[2023-10-27 10:30:05] アプリケーションが起動しました。
ファイルの内容が消えることなく、末尾に新しいログが追加されているのがわかります。 -
さらにもう一度実行
txt
[2023-10-27 10:30:00] アプリケーションが起動しました。
[2023-10-27 10:30:05] アプリケーションが起動しました。
[2023-10-27 10:30:10] アプリケーションが起動しました。
実行するたびに、どんどんログが追記されていきます。
これが「追記」の力です。コンストラクタの引数に true
を加えるだけで、動作を根本的に変えることができるのです。
4. 上書き vs 追記:使い分けの判断基準
ここで、上書きと追記の違いと、それぞれのモードをいつ使うべきかを整理しておきましょう。
項目 | 上書き (Overwrite) | 追記 (Append) |
---|---|---|
コンストラクタ | new StreamWriter(path) new StreamWriter(path, false) |
new StreamWriter(path, true) |
ファイルが存在する場合 | 既存の内容をすべて削除し、新しい内容で置き換える。 | 既存の内容は保持し、ファイルの末尾に新しい内容を追加する。 |
ファイルが存在しない場合 | 新しいファイルを作成する。 | 新しいファイルを作成する。 |
主な用途 | ・プログラムの最新の状態を保存する設定ファイル ・一時的な計算結果の出力 ・レポートやドキュメントの生成(毎回作り直すもの) |
・アプリケーションの動作ログ ・エラーログ ・CSVファイルへのレコード追加 ・チャットや履歴の記録 |
どちらを選ぶべきか?
-
「常に最新の状態だけが必要」 なのか?
- YES → 上書き
- 例:ゲームのセーブデータ、アプリケーションの設定
-
「過去の履歴を積み重ねていきたい」 のか?
- YES → 追記
- 例:Webサーバーのアクセスログ、銀行の取引履歴
このシンプルな問いに答えるだけで、ほとんどのケースで適切なモードを選択できるはずです。
5. 文字化けを防ぐ! 文字コード(エンコーディング)の指定
ここまでの例では、文字コードについて特に意識しませんでした。StreamWriter
は、デフォルトでは UTF-8 (BOM付き) という文字コードでファイルを書き込みます。UTF-8は現在のWebや多くのシステムで標準的に使われているため、多くの場合問題は起こりません。
しかし、特定の古いシステムや、ExcelでCSVファイルを直接開く場合など、Shift_JIS (CP932) のような他の文字コードでファイルを読み書きする必要が出てくることがあります。もし、書き込む側と読み込む側で文字コードの認識が違うと、「文字化け」が発生してしまいます。
StreamWriter
では、コンストラクタの3番目の引数で文字コードを明示的に指定できます。
public StreamWriter (string path, bool append, System.Text.Encoding encoding);
path
: ファイルのパスappend
: 追記モード (true
) か上書きモード (false
) かencoding
: 使用する文字コードを指定するEncoding
オブジェクト
System.Text.Encoding
クラスの使い方
C#では、System.Text.Encoding
クラスを使って様々な文字コードを表現します。
- UTF-8 (BOMなし):
new System.Text.UTF8Encoding(false)
- UTF-8 (BOM付き):
Encoding.UTF8
またはnew System.Text.UTF8Encoding(true)
(デフォルト) - Shift_JIS:
Encoding.GetEncoding("Shift_JIS")
- EUC-JP:
Encoding.GetEncoding("EUC-JP")
※BOM (Byte Order Mark) は、ファイルの先頭に付与される数バイトのデータで、そのファイルがUTF-8であることを示す目印です。システムによってはBOMがないことを期待する場合があるため、使い分けが必要です。
コード例:Shift_JISで追記する
古いシステムと連携するために、Shift_JISでCSVファイルにデータを追記するシナリオを考えてみましょう。
“`csharp
using System.Text; // Encodingクラスを使うために必要
// …
string csvFilePath = @”C:\temp\SalesData.csv”;
// Shift_JISエンコーディングを取得
Encoding sjisEnc = Encoding.GetEncoding(“Shift_JIS”);
// 追記モード、かつShift_JISを指定して書き込む
using (StreamWriter writer = new StreamWriter(csvFilePath, true, sjisEnc))
{
int productCode = 1001;
string productName = “高品質リンゴ”;
int price = 150;
// CSV形式で1行書き込む
writer.WriteLine($"{productCode},{productName},{price}");
}
Console.WriteLine(“Shift_JISでCSVデータを追記しました。”);
“`
このコードで生成された SalesData.csv
は、テキストエディタで開いた際にエンコーディングを Shift_JIS に設定すると、正しく日本語が表示されます。また、古いバージョンのExcelでも文字化けせずに開ける可能性が高まります。
ファイル操作において文字コードを意識することは、堅牢で互換性の高いアプリケーションを開発するための重要なスキルです。
6. もっと簡単に! File
クラスによる代替手段
StreamWriter
の使い方には慣れてきたでしょうか? using
を書いて、インスタンスを作って…という一連の流れは定石ですが、「ちょっとしたテキストを追記したいだけなのに、少しコードが長くなるな」と感じることもあるかもしれません。
そんなときのために、C#にはもっと簡潔にファイル操作を行える System.IO.File
という静的クラスが用意されています。
File
クラスの便利なメソッド
File
クラスは、ファイル操作に関する便利なメソッドを多数提供しており、その多くは内部で StreamWriter
や StreamReader
を使用しています。追記・上書きに関連する代表的なメソッドは以下の通りです。
File.WriteAllText(path, contents)
:
文字列contents
をファイルpath
に上書きします。File.AppendAllText(path, contents)
:
文字列contents
をファイルpath
の末尾に追記します。File.WriteAllLines(path, lines)
:
文字列の配列やリストlines
の各要素を1行としてファイルに上書きします。File.AppendAllLines(path, lines)
:
文字列の配列やリストlines
の各要素を1行としてファイルの末尾に追記します。
これらのメソッドは、ファイルのオープン、書き込み、クローズ(リソース解放)をすべて一行で完結させてくれるため、非常に便利です。
コード例:File.AppendAllText
を使ったログ追記
先ほどのログ追記の例を File.AppendAllText
で書き直してみましょう。
“`csharp
// 元のコード (StreamWriter)
/
string logFilePath = @”C:\temp\Application.log”;
using (StreamWriter writer = new StreamWriter(logFilePath, true))
{
string timestamp = DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);
writer.WriteLine($”[{timestamp}] アプリケーションが起動しました。”);
}
/
// File.AppendAllTextを使った書き換え
string logFilePath = @”C:\temp\Application.log”;
string timestamp = DateTime.Now.ToString(“yyyy-MM-dd HH:mm:ss”);
string logMessage = $”[{timestamp}] アプリケーションが起動しました。” + Environment.NewLine; // 改行を忘れずに
File.AppendAllText(logFilePath, logMessage);
Console.WriteLine(“File.AppendAllTextでログを追記しました。”);
“`
using
ブロックが不要になり、コードが劇的に短くなったのがわかります。AppendAllText
は改行を自動で追加しないため、Environment.NewLine
(環境に応じた改行コード)を自分で付与する必要がある点に注意してください。
文字コードを指定したい場合は、メソッドのオーバーロードを使います。
csharp
// Shift_JISで追記する例
File.AppendAllText(csvFilePath, csvLine, Encoding.GetEncoding("Shift_JIS"));
StreamWriter
vs File
クラス:どちらを使うべき?
StreamWriter |
File クラスの静的メソッド |
|
---|---|---|
コード量 | 長め(using ブロックが必要) |
非常に短い(1行で完結) |
柔軟性 | 高い(Write , WriteLine を自由に組み合わせられる) |
低い(一度に全コンテンツを渡す必要がある) |
メモリ効率 | 優れている。巨大なファイルでも少しずつ書き込める。 | 劣る場合がある。小さな書き込みには最適だが、大きなコンテンツを渡すとメモリを消費する。 |
おすすめの場面 | ・大量のデータをループで少しずつ書き込む場合 ・ギガバイト級の巨大なファイルを生成する場合 ・複雑なフォーマットで書き込みたい場合 |
・数行程度の簡単なテキストを書き込む/追記する場合 ・ファイル全体を一度に生成/追記できる場合 ・コードの可読性を最優先したい場合 |
基本的には、手軽な書き込みは File
クラス、本格的・大規模な書き込みは StreamWriter
と使い分けるのが良いでしょう。
7. 実践的な応用例
これまでに学んだ知識を組み合わせて、より実践的なプログラムを作成してみましょう。
応用例1:ヘッダー付きCSVファイルへのデータ追記
CSVファイルでは、1行目に「商品ID,商品名,価格」のようなヘッダー行を設けるのが一般的です。プログラムを実行するたびにデータを追記したいですが、ヘッダー行はファイルの初回作成時に一度だけ書き込みたい、というケースを考えます。
この場合、File.Exists(path)
メソッドでファイルの存在をチェックするのが有効です。
“`csharp
using System.IO;
using System.Text;
public class CsvLogger
{
private readonly string _filePath;
private readonly Encoding _encoding = Encoding.UTF8;
public CsvLogger(string filePath)
{
_filePath = filePath;
InitializeCsvFile();
}
private void InitializeCsvFile()
{
// ファイルが存在しない場合のみヘッダーを書き込む
if (!File.Exists(_filePath))
{
Console.WriteLine("CSVファイルが存在しないため、ヘッダーを書き込みます。");
string header = "Timestamp,EventType,Details" + Environment.NewLine;
File.WriteAllText(_filePath, header, _encoding); // ここは上書きでOK
}
}
public void Log(string eventType, string details)
{
string timestamp = DateTime.Now.ToString("o"); // ISO 8601形式
string record = $"\"{timestamp}\",\"{eventType}\",\"{details}\"" + Environment.NewLine;
// データを追記する
File.AppendAllText(_filePath, record, _encoding);
Console.WriteLine($"ログを追記しました: {eventType}");
}
}
// — 使い方 —
var logger = new CsvLogger(@”C:\temp\EventLog.csv”);
logger.Log(“UserLogin”, “User ‘Alice’ logged in.”);
// 少し待ってから再度実行
System.Threading.Thread.Sleep(2000);
logger.Log(“DataExport”, “Exported 100 rows to ‘report.pdf’.”);
“`
このコードのポイント
- コンストラクタで
File.Exists
をチェックし、ファイルがなければヘッダーをFile.WriteAllText
で書き込みます。 - 実際のログ追記処理
Log
メソッドでは、File.AppendAllText
を使ってデータを追加しています。 - これにより、プログラムを何度実行してもヘッダーは1行目だけに保たれ、データは正しく追記されていきます。
応用例2:日次ログファイルの作成
毎日新しいログファイル(例: log-2023-10-27.txt
)を作成し、その日のログはそのファイルに追記していく、という運用は非常に一般的です。
“`csharp
public static class DailyLogger
{
private static string GetLogFilePath()
{
// 今日の日付からファイル名を生成
string today = DateTime.Now.ToString(“yyyy-MM-dd”);
return $@”C:\temp\logs\app-{today}.log”;
}
public static void WriteLog(string message)
{
string filePath = GetLogFilePath();
// ログフォルダが存在しない場合は作成
string directory = Path.GetDirectoryName(filePath);
if (!Directory.Exists(directory))
{
Directory.CreateDirectory(directory);
}
string logEntry = $"[{DateTime.Now:HH:mm:ss.fff}] {message}" + Environment.NewLine;
// 今日のログファイルに追記
File.AppendAllText(filePath, logEntry, Encoding.UTF8);
}
}
// — 使い方 —
DailyLogger.WriteLog(“処理を開始します。”);
// … 何らかの処理 …
DailyLogger.WriteLog(“処理が正常に完了しました。”);
“`
この DailyLogger
を使えば、日付が変わると自動的に新しいログファイルに切り替わり、同じ日の中では同じファイルに追記され続けるという、便利なロギング機構が簡単に実現できます。
8. パフォーマンスと非同期処理について
最後に、少し高度ですが重要なトピックに触れておきます。
バッファリングと Flush
StreamWriter
は、パフォーマンス向上のために内部にバッファを持っています。WriteLine
を呼び出しても、即座にディスクに書き込まれるわけではなく、一旦メモリ上のバッファに溜め込まれ、バッファが一杯になるか、ストリームが閉じられるタイミングでまとめてディスクに書き出されます。
using
ステートメントを使っていれば、ブロックを抜ける際に自動的にこの「書き出し(フラッシュ)」とクローズが行われるため、通常は意識する必要はありません。
しかし、非常に長時間の処理中に、途中の経過を確実にファイルに残したい場合など、意図的にフラッシュしたい場合は writer.Flush()
メソッドを呼び出すことができます。
非同期処理 (async
/await
)
ファイルI/Oは、ディスクの読み書き速度に依存するため、比較的時間のかかる処理です。デスクトップアプリケーションでファイルI/Oを同期的に(普通に)行うと、その間UIが固まってしまい(フリーズ)、ユーザー体験を損ないます。
これを解決するのが非同期処理です。StreamWriter
には、非同期版のメソッドが用意されています。
WriteLineAsync(string value)
WriteAsync(string value)
FlushAsync()
これらを async
/await
キーワードと組み合わせて使うことで、ファイル書き込み中もUIが応答性を保つことができます。
“`csharp
// 非同期で追記する例 (WPFやWindows Formsのイベントハンドラなどを想定)
public async Task AppendLogAsync(string message)
{
string filePath = @”C:\temp\async_log.txt”;
string logEntry = $”[{DateTime.Now:T}] {message}” + Environment.NewLine;
// StreamWriterも非同期でインスタンス化できるオーバーロードがある
using (StreamWriter writer = new StreamWriter(filePath, true))
{
// awaitキーワードを付けて非同期メソッドを呼び出す
await writer.WriteAsync(logEntry);
}
// usingを抜ける際に自動でDispose(内部でFlush)される
}
“`
File
クラスにも非同期版があります。
await File.AppendAllTextAsync(filePath, logEntry);
大量のファイルI/Oを行うアプリケーションや、応答性が求められるUIアプリケーションでは、非同期処理の導入を積極的に検討しましょう。
まとめ:自信を持ってファイル操作を使いこなそう
この記事では、C#の StreamWriter
を使ったファイルの「上書き」と「追記」に焦点を当て、その仕組みから実践的な使い方までを詳しく解説しました。
最後に、重要なポイントをもう一度おさらいしましょう。
StreamWriter
はテキストファイル書き込みの基本。using
ステートメントで囲んで使うのが鉄則。- 上書きか追記かは、コンストラクタで決まる。
new StreamWriter(path)
またはnew StreamWriter(path, false)
→ 上書きnew StreamWriter(path, true)
→ 追記
- 文字化け対策は
Encoding
クラスで行う。 コンストラクタの第3引数でEncoding.GetEncoding("Shift_JIS")
などを指定する。 - 簡単な操作なら
File
クラスが便利。File.WriteAllText
(上書き) やFile.AppendAllText
(追記) でコードを簡潔にできる。 - 使い分けが重要。 手軽さの
File
クラス、柔軟性とパフォーマンスのStreamWriter
。 File.Exists
を組み合わせることで、初回のみヘッダーを書き込むといった応用が可能。- 応答性が重要なアプリでは非同期I/Oを検討する。
...Async
メソッドとasync/await
を活用しよう。
ファイル操作は、プログラミングの世界をコンソールの中から現実世界のデータへと繋ぐ、強力な架け橋です。今日学んだ知識を土台に、ぜひ様々なアプリケーションでファイル操作を試してみてください。ログを取り、設定を保存し、データをエクスポートする… あなたのプログラムの可能性は、ここからさらに大きく広がっていくはずです。
Happy Coding