基礎から学ぶC#入門 90日コース | 実践的なC#プログラミング - Day 53:ファイル操作

C# 90日で身につけるC#
スポンサーリンク
スポンサーリンク

Day 53 のゴールと全体像

Day 53 では、いよいよ 「ファイル操作」に踏み込んでいきます。 今日のキーワードは次の4つです。

  • File
  • Directory
  • 読み込み
  • 書き込み

ここまで学んできた C# の文法やオブジェクト指向の考え方を、 「実際のパソコンのファイル」に触れるところまでつなげていくイメージですね。

テキストファイルにメモを書き出したり、 ログを残したり、設定ファイルを読み込んだり―― ファイル操作ができるようになると、プログラムの世界が一気に広がります。

File クラスと Directory クラスの役割

まずは「何をしてくれるクラスなのか」をざっくりつかむ

C# では、ファイルやフォルダ(ディレクトリ)を扱うために、 System.IO 名前空間の中に便利なクラスが用意されています。

  • Fileクラス
    • ファイルの存在確認
    • ファイルの読み込み・書き込み
    • ファイルの削除・コピー など
  • Directoryクラス
    • フォルダの存在確認
    • フォルダの作成・削除
    • フォルダ内のファイル一覧取得 など

どちらも「static メソッド」が中心のクラスで、 “道具箱”のような感覚で使うクラスだと思ってもらうとイメージしやすいです。

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        // File クラスや Directory クラスを使うときは
        // System.IO 名前空間を using しておくと便利です。
    }
}
C#

Directory クラスでフォルダを扱う

フォルダがあるかどうかを確認する

まずは、フォルダ(ディレクトリ)を扱うところから始めてみます。

using System;
using System.IO;

class DirectoryExample
{
    public static void Run()
    {
        string path = "data"; // 相対パス(今のフォルダの中の data フォルダ)

        // フォルダが存在するか確認
        if (!Directory.Exists(path))
        {
            Console.WriteLine($"フォルダ '{path}' は存在しません。作成します。");

            // フォルダを作成
            Directory.CreateDirectory(path);

            Console.WriteLine($"フォルダ '{path}' を作成しました。");
        }
        else
        {
            Console.WriteLine($"フォルダ '{path}' はすでに存在しています。");
        }
    }
}
C#

ここでのポイントは次のとおりです。

  • Directory.Exists(path) で、フォルダの存在を簡単に確認できます。
  • 存在しなければ Directory.CreateDirectory(path) で作成します。
  • 「なければ作る、あればそのまま使う」というパターンは、 ログフォルダやデータ保存用フォルダなどでよく使われます。

フォルダ内のファイル一覧を取得する

フォルダの中にどんなファイルがあるかを知りたい場面も多いです。

using System;
using System.IO;

class DirectoryListExample
{
    public static void Run()
    {
        string path = "data";

        if (!Directory.Exists(path))
        {
            Console.WriteLine($"フォルダ '{path}' が存在しないため、一覧を取得できません。");
            return;
        }

        // フォルダ内のファイル一覧を取得
        string[] files = Directory.GetFiles(path);

        Console.WriteLine($"フォルダ '{path}' 内のファイル一覧:");

        foreach (var file in files)
        {
            Console.WriteLine($"- {file}");
        }
    }
}
C#

ここで意識しておきたいこと:

  • Directory.GetFiles(path) は、指定したフォルダ内のファイルパスを配列で返します。
  • ファイル名だけでなく、パス全体が返ってくるので、 必要に応じて Path.GetFileName(file) などでファイル名だけを取り出すこともできます。

File クラスでテキストを書き込む

まずは「1行書いてみる」ところから

次は、ファイルにテキストを書き込んでみます。 ここでは、シンプルに「1つの文字列を書き込む」例から始めます。

using System;
using System.IO;

class FileWriteExample
{
    public static void Run()
    {
        string folder = "data";
        string filePath = Path.Combine(folder, "message.txt");

        // フォルダがなければ作成
        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        string content = "こんにちは、C# のファイル書き込みの世界へようこそ!";

        // ファイルに文字列を書き込む(既存ファイルがあれば上書き)
        File.WriteAllText(filePath, content);

        Console.WriteLine($"ファイル '{filePath}' にメッセージを書き込みました。");
    }
}
C#

重要なポイント:

  • File.WriteAllText(path, content) は、指定したパスに文字列をまるごと書き込むメソッドです。
  • ファイルが存在しない場合は新しく作られ、 存在する場合は内容が上書きされます。
  • Path.Combine(folder, "message.txt") を使うことで、 フォルダとファイル名を安全に結合できます。

複数行を書き込む(ログっぽくしてみる)

複数行のテキストを書き込みたい場合は、 File.WriteAllLines を使うこともできます。

using System;
using System.IO;

class FileWriteLinesExample
{
    public static void Run()
    {
        string folder = "data";
        string filePath = Path.Combine(folder, "log.txt");

        if (!Directory.Exists(folder))
        {
            Directory.CreateDirectory(folder);
        }

        string[] lines =
        {
            $"ログ開始: {DateTime.Now}",
            "1行目のメッセージです。",
            "2行目のメッセージです。",
            "ログ終了。"
        };

        // 複数行を書き込む(既存ファイルがあれば上書き)
        File.WriteAllLines(filePath, lines);

        Console.WriteLine($"ファイル '{filePath}' にログを書き込みました。");
    }
}
C#

File クラスでテキストを読み込む

書いたものを読み返してみる

書き込みができたら、次は読み込みです。 先ほど書いた message.txt を読み込んでみましょう。

using System;
using System.IO;

class FileReadExample
{
    public static void Run()
    {
        string folder = "data";
        string filePath = Path.Combine(folder, "message.txt");

        // ファイルの存在を確認
        if (!File.Exists(filePath))
        {
            Console.WriteLine($"ファイル '{filePath}' が存在しません。先に書き込み処理を実行してください。");
            return;
        }

        // ファイルの内容をすべて読み込む
        string content = File.ReadAllText(filePath);

        Console.WriteLine("ファイルの内容は次のとおりです。");
        Console.WriteLine("-----");
        Console.WriteLine(content);
        Console.WriteLine("-----");
    }
}
C#

ここでのポイント:

  • File.Exists(path) で、ファイルの存在を確認できます。
  • File.ReadAllText(path) は、ファイルの内容をまるごと文字列として読み込むメソッドです。
  • 存在しないファイルを読み込もうとすると例外が発生するため、 事前に File.Exists でチェックしておくと安心です。

複数行を読み込む

複数行のテキストを読み込みたい場合は、 File.ReadAllLines を使うこともできます。

using System;
using System.IO;

class FileReadLinesExample
{
    public static void Run()
    {
        string folder = "data";
        string filePath = Path.Combine(folder, "log.txt");

        if (!File.Exists(filePath))
        {
            Console.WriteLine($"ファイル '{filePath}' が存在しません。ログを書き込む処理を先に実行してください。");
            return;
        }

        // ファイルの内容を行ごとに読み込む
        string[] lines = File.ReadAllLines(filePath);

        Console.WriteLine("ログファイルの内容:");
        Console.WriteLine("-----");

        foreach (var line in lines)
        {
            Console.WriteLine(line);
        }

        Console.WriteLine("-----");
    }
}
C#

ファイル操作と例外処理を組み合わせる

「失敗しうる処理」であることを意識する

ファイル操作は、

  • ファイルがない
  • 権限がない
  • 別のプロセスがロックしている

など、失敗する可能性が比較的高い処理です。 そのため、例外処理とセットで考える癖をつけておくと安心です。

using System;
using System.IO;

class SafeFileExample
{
    public static void Run()
    {
        string folder = "data";
        string filePath = Path.Combine(folder, "safe.txt");

        try
        {
            if (!Directory.Exists(folder))
            {
                Directory.CreateDirectory(folder);
            }

            // 書き込み
            File.WriteAllText(filePath, "安全なファイル書き込みのテストです。");

            // 読み込み
            string content = File.ReadAllText(filePath);

            Console.WriteLine("ファイルの内容:");
            Console.WriteLine(content);
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("ファイルへのアクセス権限がありません。");
            Console.WriteLine($"詳細: {ex.Message}");
        }
        catch (IOException ex)
        {
            Console.WriteLine("ファイルの読み書き中にエラーが発生しました。");
            Console.WriteLine($"詳細: {ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine("予期しないエラーが発生しました。");
            Console.WriteLine($"詳細: {ex.Message}");
        }
    }
}
C#

ここで意識しておきたいこと:

  • ファイル操作は「例外が起きてもおかしくない処理」だと考える。
  • try-catch で囲み、ユーザーにわかりやすいメッセージを返す。
  • ログを残したり、再試行したりといった戦略も、実務ではよく使われます。

Day 53 の小さな統合テンプレート

「フォルダを作る → ファイルに書く → 読み返す」をひとつにまとめる

最後に、今日学んだ内容をひとつの流れにまとめた、 小さなテンプレートを示しておきます。

using System;
using System.IO;

class Program
{
    static void Main(string[] args)
    {
        string folder = "data";
        string filePath = Path.Combine(folder, "note.txt");

        try
        {
            // 1. フォルダの存在確認と作成
            if (!Directory.Exists(folder))
            {
                Console.WriteLine($"フォルダ '{folder}' が存在しないため、作成します。");
                Directory.CreateDirectory(folder);
            }

            // 2. ユーザーからメッセージを入力してもらう
            Console.WriteLine("メモを書き込みます。好きなメッセージを入力してください。");
            string message = Console.ReadLine();

            // 3. ファイルに書き込み
            File.WriteAllText(filePath, message);
            Console.WriteLine($"ファイル '{filePath}' にメッセージを書き込みました。");

            // 4. ファイルから読み込み
            string readBack = File.ReadAllText(filePath);

            Console.WriteLine("ファイルから読み込んだ内容は次のとおりです。");
            Console.WriteLine("-----");
            Console.WriteLine(readBack);
            Console.WriteLine("-----");
        }
        catch (IOException ex)
        {
            Console.WriteLine("ファイルの読み書き中にエラーが発生しました。");
            Console.WriteLine($"詳細: {ex.Message}");
        }
        catch (Exception ex)
        {
            Console.WriteLine("予期しないエラーが発生しました。");
            Console.WriteLine($"詳細: {ex.Message}");
        }

        Console.WriteLine("処理を終了します。");
        Console.ReadLine();
    }
}
C#

このコードを実行すると、

  1. data フォルダを作り
  2. ユーザーの入力を note.txt に書き込み
  3. その内容を読み返して表示する

という、一連の「ファイル操作の基本セット」を体験できます。

Day 53 のまとめ

Day 53 では、

  • Directory クラスでフォルダの存在確認・作成・一覧取得を行う方法
  • File クラスでテキストの書き込み・読み込みを行う方法
  • ファイル操作と例外処理を組み合わせて、安全に失敗を扱う考え方

を、具体的なコード例とともに学びました。

ファイル操作ができるようになると、

  • ログを残す
  • 設定ファイルを読み込む
  • ユーザーのデータを保存する

といった「実用的なプログラム」に一気に近づいていきます。

ぜひ、

  • ファイル名やフォルダ名を変えてみる
  • 複数のファイルを扱ってみる
  • 読み込んだ内容を加工して、別のファイルに書き出してみる

といった小さな工夫を重ねながら、 ファイル操作の感覚を少しずつ自分のものにしていっていただければうれしいです。

タイトルとURLをコピーしました