まず、これは、親フォルダーの名前の1つを知っていることに依存します。
const string FILENAME = "obstacleList.xml";
const string FOLDER = "TrajectoryGen";
string path = Path.GetFullPath(System.Reflection.Assembly.GetExecutingAssembly().Location);
do
{
path = Path.GetDirectoryName(path);
} while (!Path.GetFileName(path).Equals(FOLDER, StringComparison.OrdinalIgnoreCase));
string filepath = String.Format("{0}{1}{2}", path, Path.DirectorySeparatorChar, FILENAME);
^^名前がわかっている「ベース」フォルダに移動した後でディレクトリに移動する必要がある場合は、以下の例のようにFILENAMEで部分パスを使用することもできます。
2番目の方法は盲目的にディレクトリを続行します
const string FILENAME = @"TrajectoryGen\obstacleList.xml";
string path = Path.GetFullPath(System.Reflection.Assembly.GetExecutingAssembly().Location);
string filepath;
do
{
path = Path.GetDirectoryName(path);
//pump
filepath = String.Format("{0}{1}{2}", path, Path.DirectorySeparatorChar, FILENAME);
} while (!File.Exists(filepath));
どちらも「System.IOを使用する」必要があります。どちらにもエラー処理は実装されておらず、ファイル/フォルダーが見つからない場合はNullReferenceExceptionがスローされます。
パスの定義に実行可能ファイル名が含まれるため、意図的にdo-whileループを使用しました。