1

C# でのファイルの読み取りに問題があります。.exe 用に 2 つの異なる場所 (両方とも異なる) があり、同じ .xml ファイルを読み取ります。したがって、次のようにパスを指定すると:

TextReader textReader = new StreamReader(@"../../../TrajectoryGen/obstacleList.xml");

ある場所 (パスで使用されているように 3 フォルダー後ろ) からは読み取ることができますが、別の場所 (2 フォルダー後ろ) からは読み取ることができません。

4

1 に答える 1

0

まず、これは、親フォルダーの名前の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ループを使用しました。

于 2013-02-15T21:56:03.350 に答える