C#のファイル操作と入出力は、プログラムが外部データを管理するための基本機能です。ファイルへのデータ保存やログの管理、ユーザーとの対話を行うために、効率的かつ安全にファイルとやり取りする方法を学びます。この章では、ファイルの読み書き、バイナリデータの操作、ディレクトリ操作、コンソール入出力、そしてシリアル化とデシリアル化を解説します。
9.1 ファイルの読み書き (StreamReader, StreamWriter, Fileクラス)
ファイルにデータを書き込んだり、ファイルからデータを読み込む操作は、ほとんどのプログラムにおいて基本的な処理です。C#では、StreamReaderやStreamWriter、Fileクラスを使って効率的にこれらの操作を行います。
StreamReaderを使ったファイルの読み込み
using (StreamReader reader = new StreamReader("example.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
解説
StreamReader
は、ファイルを開いてその内容を読み込むためのクラスです。ReadLine()
は、ファイルから1行ずつデータを取得します。ファイルの終わりに達するとnull
を返します。
重要: using
ブロックは、ファイルを安全に閉じるために使用します。これにより、ファイル操作が終わった後にリソースが自動的に解放されます。
エラーハンドリングを追加
try
{
using (StreamReader reader = new StreamReader("example.txt"))
{
string line;
while ((line = reader.ReadLine()) != null)
{
Console.WriteLine(line);
}
}
}
catch (FileNotFoundException e)
{
Console.WriteLine($"ファイルが見つかりません: {e.Message}");
}
catch (Exception e)
{
Console.WriteLine($"エラーが発生しました: {e.Message}");
}
StreamWriterを使ったファイルの書き込み
using (StreamWriter writer = new StreamWriter("output.txt"))
{
writer.WriteLine("This is a new line in the file.");
}
エラーハンドリングと追記モード
try
{
using (StreamWriter writer = new StreamWriter("output.txt", append: true)) // 追記モード
{
writer.WriteLine("This line will be appended.");
}
}
catch (UnauthorizedAccessException e)
{
Console.WriteLine($"ファイルへの書き込みに失敗しました: {e.Message}");
}
Fileクラスを使った簡単なファイル操作
if (File.Exists("example.txt"))
{
string content = File.ReadAllText("example.txt");
Console.WriteLine(content);
}
else
{
Console.WriteLine("ファイルが存在しません。");
}
解説
File.Exists()
は、指定されたファイルが存在するかを確認します。File.ReadAllText()
は、ファイル全体を文字列として一度に読み込むメソッドです。
注意点: 大きなファイルを読み込む場合は、メモリ不足に注意が必要です。
9.2 バイナリデータの操作 (BinaryReader, BinaryWriter)
テキストファイルではなく、バイナリデータを扱う必要がある場合、BinaryReader
とBinaryWriter
を使用します。例えば、画像や音声ファイルの読み書きに便利です。
BinaryReaderを使ったバイナリデータの読み込み
using (BinaryReader reader = new BinaryReader(File.Open("data.bin", FileMode.Open)))
{
try
{
int number = reader.ReadInt32();
double value = reader.ReadDouble();
Console.WriteLine($"Number: {number}, Value: {value}");
}
catch (EndOfStreamException e)
{
Console.WriteLine($"ストリームの終わりに達しました: {e.Message}");
}
}
BinaryWriterを使ったバイナリデータの書き込み
using (BinaryWriter writer = new BinaryWriter(File.Open("data.bin", FileMode.Create)))
{
writer.Write(42);
writer.Write(3.14);
}
解説
BinaryReader
やBinaryWriter
は、数値や文字列をバイナリ形式で効率的に読み書きでき、ファイルサイズを節約できます。大容量のデータや構造体の保存・読み込みに適しています。
9.3 ディレクトリとファイル操作 (Directory, FileInfoクラス)
ディレクトリの作成、ファイルの移動や削除、ディレクトリ内のファイルの一覧取得など、より高度な操作にはDirectory
クラスやFileInfo
クラスを使います。
Directoryクラスを使ったディレクトリ操作
// 新しいディレクトリを作成
Directory.CreateDirectory("new_folder");
// ディレクトリ内のファイル一覧を取得
string[] files = Directory.GetFiles("existing_folder");
foreach (string file in files)
{
Console.WriteLine(file);
}
// ディレクトリの削除
Directory.Delete("new_folder", true); // trueを指定して、ディレクトリ内のファイルも削除
FileInfoクラスを使ったファイル情報の取得
FileInfo fileInfo = new FileInfo("example.txt");
if (fileInfo.Exists)
{
Console.WriteLine($"ファイルサイズ: {fileInfo.Length} バイト");
Console.WriteLine($"作成日: {fileInfo.CreationTime}");
}
else
{
Console.WriteLine("ファイルが存在しません。");
}
解説
Directory
クラスは、ディレクトリ全体を操作するためのメソッドを提供します。FileInfo
クラスは、個々のファイルに関する詳細な情報(サイズ、作成日、最終アクセス日時など)を取得するのに便利です。
9.4 コンソール入力と出力
プログラム実行中にユーザーからの入力を受け付けたり、結果をコンソールに表示するために、Console
クラスを使います。
コンソール入力
Console.WriteLine("名前を入力してください:");
string name = Console.ReadLine();
if (!string.IsNullOrEmpty(name))
{
Console.WriteLine($"こんにちは、{name}さん!");
}
else
{
Console.WriteLine("名前が入力されていません。");
}
コンソール出力
int age = 30;
Console.WriteLine($"私は{age}歳です。");
解説
Console.ReadLine()
は、ユーザーからの入力を文字列として取得します。また、Console.WriteLine()
は、結果やメッセージをコンソールに表示するためのメソッドで、文字列補間を使って変数を簡単に埋め込むことができます。
9.5 シリアル化とデシリアル化 (JSON, XML形式)
データを保存したり、ネットワークを介して送受信する場合、オブジェクトをシリアル化してテキストデータに変換する必要があります。C#では、JSONやXML形式でデータをシリアル化・デシリアル化することができます。
JSON形式のシリアル化とデシリアル化
using System.Text.Json;
// オブジェクトをJSON形式にシリアル化
Person person = new Person { Name = "Alice", Age = 30 };
string json = JsonSerializer.Serialize(person);
Console.WriteLine(json);
// JSON形式からオブジェクトをデシリアル化
Person deserializedPerson = JsonSerializer.Deserialize<Person>(json);
Console.WriteLine($"名前: {deserializedPerson.Name}, 年齢: {deserializedPerson.Age}");
XML形式のシリアル化とデシリアル化
using System.Xml.Serialization;
using System.IO;
XmlSerializer serializer = new XmlSerializer(typeof(Person));
using (StreamWriter writer = new StreamWriter("person.xml"))
{
serializer.Serialize(writer, person);
}
using (StreamReader reader = new StreamReader("person.xml"))
{
Person deserializedPerson = (Person)serializer.Deserialize(reader);
Console.WriteLine($"名前: {deserializedPerson.Name}, 年齢: {deserializedPerson.Age}");
}
解説
JSONやXMLのシリアル化とデシリアル化は、データの保存や通信に便利です。JsonSerializer
とXmlSerializer
を使って、オブジェクトをテキスト形式に変換したり、その逆を行うことができます。
まとめ
この章では、C#におけるファイル操作と入出力の基本を深く掘り下げて学びました。ファイルの読み書き、バイナリデータの操作、ディレクトリ管理、コンソール入力出力、さらにはJSONやXML形式でのシリアル化とデシリアル化など、実際の開発現場で役立つ幅広い知識を身につけました。これらの技術を活用することで、アプリケーションが外部データとスムーズにやり取りできるようになり、ユーザーやシステムとの連携が強化されます。
コメント