web-dev-qa-db-ja.com

C#を使用してソリューションファイルの親フォルダーへのパスを取得する

私はC#の初心者であり、ファイルを読み取るフォルダーがあります。

ソリューションファイルの親フォルダにあるファイルを読みたい。どうすればよいですか?

string path = "";
StreamReader sr = new StreamReader(path);

したがって、ファイルXXX.slnC:\X0\A\XXX\にある場合は、.txt内のC:\X0\A\ファイルを読み取ります。

12
User1204501

これを試して:

string startupPath = Path.Combine(Directory.GetParent(System.IO.Directory.GetCurrentDirectory()).Parent.Parent.Parent.FullName,"abc.txt");

// Read the file as one string. 
string text = System.IO.File.ReadAllText(startupPath);
19
Thilina H

ソリューションの検索に依存するこのより一般的なソリューションをお楽しみいただけます*.slnファイルは、現在のディレクトリまたは選択されたディレクトリからすべての親ディレクトリをスキャンし、ソリューションディレクトリが見つからない場合をカバーします。

public static class VisualStudioProvider
{
    public static DirectoryInfo TryGetSolutionDirectoryInfo(string currentPath = null)
    {
        var directory = new DirectoryInfo(
            currentPath ?? Directory.GetCurrentDirectory());
        while (directory != null && !directory.GetFiles("*.sln").Any())
        {
            directory = directory.Parent;
        }
        return directory;
    }
}

使用法:

// get directory
var directory = VisualStudioProvider.TryGetSolutionDirectoryInfo();
// if directory found
if (directory != null)
{
    Console.WriteLine(directory.FullName);
}

あなたの場合:

// resolve file path
var filePath = Path.Combine(
    VisualStudioProvider.TryGetSolutionDirectoryInfo()
    .Parent.FullName, 
    "filename.ext");
// usage file
StreamReader reader = new StreamReader(filePath);

楽しい!

さて、警告..あなたのアプリケーションはソリューションにとらわれないはずです-これが私が気にしないソリューション処理ツールの個人的なプロジェクトでない限り。ユーザーに配布されたアプリケーションwillは、ソリューションのないフォルダに存在することを理解してください。これで、「アンカー」ファイルを使用できます。例えば。私のように親フォルダーを検索し、空のファイルの存在を確認しますapp.anchorまたはmySuperSpecificFileNameToRead.ext; Pもし私ができるメソッドを書いて欲しいなら-知らせてください。

今、あなたは本当に楽しむことができます! :D

12
Demetris Leptos

ファイルパスとソリューションパスの関係に基づいて、アプリケーションがファイルの場所に依存しているとしたら、それは見当違いだと思います。プログラムはSolution/Project/Bin/$(ConfigurationName)/$(TargetFileName)で実行されている可能性がありますが、これはVisual Studioの範囲内から実行している場合にのみ機能します。 Visual Studioの外では、他のシナリオでは、これは必ずしもそうではありません。

2つのオプションが表示されます。

  1. プロジェクトの一部としてファイルを含め、そのプロパティで、出力フォルダーにコピーします。その後、このようにしてファイルにアクセスできます。

    string filePath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "Yourfile.txt");
    

    デプロイメント中に、このファイルが実行可能ファイルとともにデプロイされることを確認する必要があることに注意してください。

  2. コマンドライン引数を使用して、起動時にファイルへの絶対パスを指定します。これはVisual Studio内でデフォルト設定できます(プロジェクトのプロパティ->デバッグタブ->コマンドライン引数を参照してください)。

    filePath="C:\myDevFolder\myFile.txt"
    

    コマンドラインの解析に関しては、いくつかの方法とライブラリがあります。 ここにスタックオーバーフローの回答があります コマンドライン引数の解析。

6
Moo-Juice

これがあなたの望んでいることだと思います。ただし、公開するときに良いアイデアかどうかはわかりません。

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

using System.IO;が必要

2
stevepkr84
string path = Application.StartupPath;
1
Anand