web-dev-qa-db-ja.com

いくつかのフォルダーを上に移動する方法は?

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

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

95
developer747

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

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

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

180
A-Sharabiani

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 \として取得します

25
Siby Sunny

..\pathを使用して1レベル上に移動し、..\..\pathを使用してパスから2レベル上に移動できます。

Pathクラスも使用できます。

C#パスクラス

9
DotNetUser

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

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

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

5
Jacco

次のメソッドは、アプリケーションのスタートアップパス(* .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)必要に応じて。

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

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
CR41G14

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

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

ナビゲートしたいフォルダがわかっている場合は、そのインデックスを見つけてからサブストリングを見つけます。

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

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

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

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

したがって、4つ上に移動する場合は、14に変更し、いくつかのチェックを追加して例外を回避する必要があります。

0
Sauleil