【C#】現在の作業ディレクトリ(カレントディレクトリ)を取得・変更する

プログラムが現在実行の基準としている「作業ディレクトリ(Current Directory)」を取得するには、Directory.GetCurrentDirectory メソッドを使用します。

相対パス(例:./data.txt)でファイルを読み書きする際、このカレントディレクトリが起点となります。

目次

実装サンプル:作業場所の確認と変更

以下のコードでは、プログラム起動時のディレクトリを表示した後、一時フォルダに作業場所を移動(SetCurrentDirectory)し、相対パスの解決先が変化することを確認しています。

サンプルコード

using System;
using System.IO;

public class Program
{
    public static void Main()
    {
        // 1. 現在の作業ディレクトリを取得
        string startDir = Directory.GetCurrentDirectory();
        Console.WriteLine($"[起動時] {startDir}");

        // テスト用サブフォルダの名前
        string subDirName = "WorkArea";
        
        // フォルダがなければ作る
        if (!Directory.Exists(subDirName))
        {
            Directory.CreateDirectory(subDirName);
        }

        // 2. 作業ディレクトリを変更する
        // これ以降、相対パスの基準はこのサブフォルダになります
        Directory.SetCurrentDirectory(subDirName);

        // 変更後のパスを取得して確認
        string newDir = Directory.GetCurrentDirectory();
        Console.WriteLine($"[移動後] {newDir}");

        // 3. 相対パスでのファイル作成テスト
        // パスを指定せずファイル名だけで作成すると、カレントディレクトリに作られます
        string fileName = "test.log";
        File.WriteAllText(fileName, "Log content");

        // 実際にどこに作られたか絶対パスで確認
        string fullPath = Path.GetFullPath(fileName);
        Console.WriteLine($"[作成ファイル] {fullPath}");
    }
}

実行結果(例)

[起動時] C:\Projects\MyApp\bin\Debug\net6.0
[移動後] C:\Projects\MyApp\bin\Debug\net6.0\WorkArea
[作成ファイル] C:\Projects\MyApp\bin\Debug\net6.0\WorkArea\test.log

解説と技術的なポイント

1. 実行ファイルの場所との違い

Directory.GetCurrentDirectory() はあくまで「現在作業している場所」であり、EXEファイルが置いてある場所とは限らない点に注意が必要です。 例えば、ショートカットから起動した場合や、コマンドプロンプトで別の場所から EXE を叩いた場合、カレントディレクトリは「コマンドを打った場所」になります。

EXEのある場所を確実に取得したい場合は、AppContext.BaseDirectory を使用します。

2. Directory.SetCurrentDirectory

作業ディレクトリをプログラム実行中に変更します。 これを行うと、File.Open("file.txt", ...) のようにパスなしでファイルを開く際の参照先が変わります。便利な反面、プログラム全体に影響するため、不用意に変更すると別の処理で「ファイルが見つからない」エラーを引き起こす原因になります。

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

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次