【C#】プログラム上でフォルダを作成する方法をわかりやすく解説

※ この記事にはアフィリエイトリンクが含まれます

フォルダをプログラムで作成したいけれど、うまく動作しないことに悩んでいませんか?

  • 指定したパスにフォルダができない
  • パスの結合や区切り文字でエラーになる
  • 権限エラーや例外の扱いがわからない

結論から言うと、C#では System.IO 名前空間の Directory.CreateDirectoryPath.Combine を正しく使えば安全にフォルダを作成できます。

主な解決方法は次の通りです。

  • Path.Combine でパスを組み立てる
  • Directory.Exists で存在確認する(必須ではない)
  • 例外(UnauthorizedAccessException、IOException など)を適切にハンドルする

この記事では、初心者向けに基本的な使い方、よくあるトラブルと対処法、実践的なコード例をわかりやすく解説します。

目次

フォルダ作成の基本的な考え方

C#でフォルダを作成する最も基本的な方法は、System.IO.Directory.CreateDirectory メソッドを使うことです。

このメソッドは指定したパスのフォルダが存在しない場合に作成し、既に存在する場合は何もしません。

また、CreateDirectory は必要に応じて親フォルダも自動で作成してくれる点が便利です。

Path.Combine を使う理由

パスを手で結合すると区切り文字(\ または /)の扱いでミスが発生することがあります。

Path.Combine を使えば、OSに依存しない形で安全にパスを作成できます。

特にユーザーのフォルダやアプリの設定フォルダを扱うときは必ず Path.Combine を使いましょう。

よく使うコード例と解説

ここでは代表的なコード例を示します。まずはコンソールアプリで試す簡単な例です。

using System;
using System.IO;

class Program
{
    static void Main()
    {
        string baseDir = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        string newFolder = Path.Combine(baseDir, "MyAppData", "Logs");

        try
        {
            Directory.CreateDirectory(newFolder);
            Console.WriteLine($"フォルダを作成しました: {newFolder}");
        }
        catch (UnauthorizedAccessException ex)
        {
            Console.WriteLine("アクセス権がありません: " + ex.Message);
        }
        catch (IOException ex)
        {
            Console.WriteLine("IOエラーが発生しました: " + ex.Message);
        }
    }
}

この例では、My Documents の配下に MyAppData/Logs を作成しています。

CreateDirectory を呼ぶだけで親ディレクトリも自動的に作られます。

DirectoryInfo を使うケース

DirectoryInfo クラスはオブジェクト指向的にディレクトリ操作を行いたい場合に使います。

var dirInfo = new DirectoryInfo(newFolder);
if (!dirInfo.Exists)
{
    dirInfo.Create();
}

DirectoryInfo はプロパティやメソッドが豊富で、情報取得や操作ログを書くときに便利です。

よくあるトラブルと対処法

ここでは初心者が詰まりやすいポイントを順に解説します。

パスの区切り文字/Path.Combine を使っていない

手で文字列を結合すると "C:\folder""sub" のように二重に区切りがあったり、逆に区切りが抜けたりします。

常に Path.Combine を使う習慣をつけましょう。これで多くのパス関連バグが回避できます。

アクセス権(UnauthorizedAccessException)

Program Files などシステム領域に作成しようとするとアクセス権がなく例外になります。

対処法は次の通りです。ユーザーのドキュメントやアプリケーション専用のフォルダを使う、または管理者権限で実行することです。

既存ファイルと同名のフォルダがある場合

同じパスにファイルが存在する場合、ディレクトリを作成すると IOException が発生することがあります。

Directory.Exists のチェックだけでなく、File.Exists を併用して同名のファイルがないか確認しましょう。

パスが長すぎる(Windowsの制限)

Windows には古い仕様でパス長制限(MAX_PATH)があり、長すぎるパスは例外の原因になります。

.NET Core / .NET 5+ では長いパスをサポートしていますが、互換性を考慮して適切に分割して管理することをおすすめします。

実践:よくあるユースケース別の実装例

日付ごとのログフォルダを作る

日付で分けてログを保存するケースは多いです。Path.CombineDateTime を組み合わせます。

string baseDir = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "MyApp", "Logs");
string dateFolder = Path.Combine(baseDir, DateTime.Now.ToString("yyyy-MM-dd"));
Directory.CreateDirectory(dateFolder);

この方法だと毎日新しいフォルダが自動で作成され、ログ管理がしやすくなります。

ユーザー入力からフォルダを作る場合の注意

ユーザーが入力した文字列をそのままパスに使うと、無効な文字や\.. のような不正なパスが混入する恐れがあります。

Path.GetInvalidPathChars() やパターンマッチで禁止文字を除外するなど、入力バリデーションを行ってください。

セキュリティとパフォーマンスのポイント

フォルダ作成自体は軽量な処理ですが、頻繁に繰り返す場合は注意が必要です。

同じ存在チェックを何度も行う代わりに、作成したことをキャッシュするなどの工夫が有効です。

また、権限チェックは早い段階で行い、ユーザーにわかりやすいエラーメッセージを出すことが重要です。

よくある質問(FAQ)

Directory.CreateDirectory は既に存在しているフォルダに対して何もしませんか?

はい。既に存在する場合は例外を投げず、その DirectoryInfo を返します。

したがって存在チェックを省いても安全に呼ぶことができますが、存在の有無で処理を分けたい場合は Directory.Exists を使ってください。

非同期でフォルダを作れますか?

フォルダ作成自体に専用の非同期メソッドはありません。IO操作ですが非常に短時間で終わることが多いため、通常は同期で問題ありません。

大量にディレクトリを作成するようなケースでは Task.Run などで非同期化する選択肢がありますが、権限や競合に注意してください。

まとめ

C#でフォルダを作成する基本は、Path.Combine でパスを組み立て、Directory.CreateDirectory で作成することです。

よくある失敗はパスの結合ミス、権限不足、同名ファイルの存在です。これらは事前チェックや例外ハンドリングで対応できます。

この記事を読めば、初心者でも安全にフォルダ作成ができるようになり、実際のアプリケーションで使える実践的なコード例を学べます。

ぜひ今回のコード例をコピーして動かし、自分の用途に合わせてカスタマイズしてみてください。

#エンジニアとして、もっと自分の力を活かしたいあなたへ

「このまま今の職場にいて、成長できるんだろうか?」

C#を使っている方なら、一度はそう感じたことがあるかもしれません。

実は今、C#/.NETエンジニアの市場価値は高まっており
年収アップ・フルリモート・自社開発企業など、選べる選択肢は確実に増えています。

もし今後、C#を活かして働きたい、あるいは開発現場で経験を積みたいとお考えなら…
自分に合った転職サービスを早めに知っておくことが大きな武器になります。

現役エンジニアからのサポート付き・無料で学べるスクール・社内SE特化の求人など、
転職支援サービスを厳選したまとめ記事をこちらで紹介しています。

ここまで読んでいただきありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

沖縄出身のエンジニアです。IT業界で5年以上の経験があり、主にC#やPHPを使って開発を行ってきました。新しい技術にも興味があり、日々学びながらスキルアップを目指しています。

コメント

コメントする

CAPTCHA


目次