いくつかのフォルダを上にナビゲートする方法は?


115

1つのオプションは、System.IO.Directory.GetParent()を数回実行することです。実行中のアセンブリが存在する場所からいくつかのフォルダを上へ移動するより適切な方法はありますか?

私がやろうとしていることは、アプリケーションフォルダーの1つ上のフォルダーにあるテキストファイルを見つけることです。ただし、アセンブリ自体はビン内にあります。これは、アプリケーションフォルダーの深いいくつかのフォルダーです。


2
通常、相対パスは '.. \ .. \ .. \ .. \ Downfolder'のようなトリックを実行しますが、これを何をしようとしているかに依存します...?
DiskJunky 2013

これは常にそうですか?
CR41G14 2013

4
どのように「ナビゲート」しますか?現在のディレクトリですか?もしそうなら、あなたはできるはずですDirectory.SetCurrentDirectory(@"..\..\..\..");
ピーター・リッチー

回答:


211

他の簡単な方法はこれを行うことです:

string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));

これは2レベル上がります。結果は次のようになります。 newPath = @"C:\Folder1\Folder2\";


18
Path.Combineとにかく手動でバックスラッシュを追加するときに使用しても意味がありません。Path.Combine(path, "..", "..")代わりに使用することを検討してください。
AXMIM 2019

32

c:\ folder1 \ folder2 \ folder3 \ binがパスの場合、次のコードはbinフォルダーのパスベースフォルダーを返します

//string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString());

string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString();

つまり、c:\ folder1 \ folder2 \ folder3

folder2パスが必要な場合は、次の方法でディレクトリを取得できます

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();

次に、c:\ folder1 \ folder2 \としてパスを取得します



6

これは私にとって最もうまくいったものです:

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));

「正しい」パスを取得することは問題ではありませんでした。「../」を追加することは明らかにそれを行いますが、その後、指定された文字列は使用できません。で囲むとPath.GetFullPath()絶対パスが得られ、使いやすくなります。


4

次のメソッドは、アプリケーションの起動パス(* .exeフォルダー)で始まるファイルを検索します。そこでファイルが見つからない場合、ファイルが見つかるか、ルートフォルダに到達するまで、親フォルダが検索されます。nullファイルが見つからなかった場合に返されます。

public static FileInfo FindApplicationFile(string fileName)
{
    string startPath = Path.Combine(Application.StartupPath, fileName);
    FileInfo file = new FileInfo(startPath);
    while (!file.Exists) {
        if (file.Directory.Parent == null) {
            return null;
        }
        DirectoryInfo parentDir = file.Directory.Parent;
        file = new FileInfo(Path.Combine(parentDir.FullName, file.Name));
    }
    return file;
}

注:Application.StartupPath通常はWinFormsアプリケーションで使用されますが、コンソールアプリケーションでも機能します。ただし、System.Windows.Formsアセンブリへの参照を設定する必要があります。あなたは置き換えることができますApplication.StartupPath
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)ご希望の場合。


4

レベルの数を宣言して関数に入れたい場合は、関数を使用できますか?

private String GetParents(Int32 noOfLevels, String currentpath)
{
     String path = "";
     for(int i=0; i< noOfLevels; i++)
     {
         path += @"..\";
     }
     path += currentpath;
     return path;
}

そして、次のように呼び出すことができます。

String path = this.GetParents(4, currentpath);

2

C#

string upTwoDir = Path.GetFullPath(Path.Combine(System.AppContext.BaseDirectory, @"..\..\"));

1

これは役立つかもしれません

string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
    // file found
}

1

仮想ディレクトリがいくつかあり、Directoryメソッドを使用できません。それで、興味のある人のために簡単な分割/結合関数を作りました。安全ではありませんが。

var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());

したがって、4を上に移動する場合は、例外を回避するために1to を変更して4チェックを追加するだけです。


0

移動先のフォルダーがわかっている場合は、そのフォルダーのインデックスを検索し、次にサブストリングを検索します。

            var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");

            string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);

2
これは多くの場合失敗します。aたとえば、フォルダの名前がだけの場合はどうなりますか?パスがこのようになった場合はどうなりますC:\Folderame3\Folderame2\Folderame\...か?
41686d6564

フォルダ名が単なる検索「\\ a \\」または最後の場合は\\ aの場合
Taran
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.