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