web-dev-qa-db-ja.com

ファイルの相対パスを取得するC#

現在、c#のビジュアルスタジオでプロジェクトを作成しています。プロジェクトの完全パスは次のとおりです。

"C:\TFS\MySolution\"

実行中にロードする必要があるファイルがあります。ファイルのパスが

"C:\TFS\MySolution\Project1\NeedtoLoad.xml"

ハードコーディングされたフルパスを記述したくないし、動的な方法でパスを取得したい。

次の行を使用します。

    var path = Directory.GetCurrentDirectory();

私が見つけたすべてのメソッドと上記のコード行が次のパスを取得するという問題:

"C:\TFS\MySolution\Project1\bin\Debug"

そして、私が必要なのは

"C:\TFS\MySolution\Project1\"

だから私は連結することができました

NeedtoLoad.xml

答えに。

もちろん私はできる:

path.Substring(0, path.IndexOf("bin\\Debug"));

しかし、それはそれほどエレガントではありません。

5
daniel the man

Directory.GetParentとそのParentメンバーを使用できます

string path = Directory.GetParent(Directory.GetCurrentDirectory()).Parent.FullName;

パスツリーを2レベル上に移動し、"C:\TFS\MySolution\Project1"を返します。

6
Guy

Xmlがプロジェクトの静的な部分である場合(実行時にそれをオーバーライドしない)、おそらく、それをdllに含めることが最善の方法です。

  • ファイルのプロパティに移動し、それを埋め込みリソースにします
  • DLLリソースからロードするだけです。

    var asm = Assembly.GetCallingAssembly();
    using (var stream = asm.GetManifestResourceStream(resource))
    {
        var reader = new StreamReader(stream);
        return reader.ReadToEnd();
    }
    
2
mikka

そのファイルがプロジェクトの一部である場合は、ビルド時にプロジェクト出力にコピーされることを確認する必要があります。

ソリューションエクスプローラーでファイルを選択し、Visual Studio(F4)のプロパティペインに移動します。 「ビルドアクション」として「コンテンツ」を選択します。これで、ソリューションをビルドすると、ファイルが出力ディレクトリ(bin/Debugまたはbin/Release)にコピーされます。

1
gnud