web-dev-qa-db-ja.com

C#で親ディレクトリを見つけるにはどうすればよいですか?

デバッグディレクトリを見つけるためにこのコードを使用します

public string str_directory = Environment.CurrentDirectory.ToString();

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug"

以下に示すように親フォルダーを見つけるにはどうすればよいですか?

"C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj"

65
Masoud Abasian

System.IO.Directory.GetParent() を使用して、特定のディレクトリの親ディレクトリを取得できます。

106
Sylence
string parent = System.IO.Directory.GetParent(str_directory).FullName;

[〜#〜] bol [〜#〜] を参照してください

41
billinkc

..\..を既存のパスに追加すると、オペレーティングシステムは祖父母フォルダーを正しく参照します。

それは仕事をするはずです:

System.IO.Path.Combine("C:\\Users\\Masoud\\Documents\\Visual Studio 2008\\Projects\\MyProj\\MyProj\\bin\\Debug", @"..\..");

そのパスを参照する場合、グランドペアレントディレクトリを参照します。

26

System.IO.Path.Combine(myPath, "..")のバリアントが最も簡単で信頼性が高いことがわかりました。さらに、もしnorthbenが言っていることが真実なら、そのGetParentは、末尾にスラッシュがある場合、追加の呼び出しを必要とします。私には、それは信頼できません。

Path.Combineは、スラッシュを間違えないようにします。

_.._は、Windowsの他の場所とまったく同じように動作します。 cmdまたはExplorerのパスに任意の数の_\.._を追加できます。これは、以下で説明するとおりに動作します。

基本的な_.._の動作:

  1. ファイル名がある場合、_.._はそれを切り捨てます:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..") => _D:\Grandparent\Parent\_

  1. パスがディレクトリの場合、_.._は次のレベルに移動します。

Path.Combine(@"D:\Grandparent\Parent\", "..") => _D:\Grandparent\_

  1. _..\.._は同じルールに従い、2回続けて実行されます。

Path.Combine(@"D:\Grandparent\Parent\Child.txt", @"..\..") => _D:\Grandparent\_ Path.Combine(@"D:\Grandparent\Parent\", @"..\..") => _D:\_

  1. そして、これはまったく同じ効果があります:

Path.Combine(@"D:\Grandparent\Parent\Child.txt", "..", "..") => _D:\Grandparent\_ Path.Combine(@"D:\Grandparent\Parent\", "..", "..") => _D:\_

14
Timo

「祖父母」ディレクトリを取得するには、 Directory.GetParent() を2回呼び出します。

var gparent = Directory.GetParent(Directory.GetParent(str_directory).ToString());
11
Jay Riggs

このような:

System.IO.DirectoryInfo myDirectory = new DirectoryInfo(Environment.CurrentDirectory);
string parentDirectory = myDirectory.Parent.FullName;

幸運を!

6
Michael Ames

Directory.GetParentはおそらくより良い答えですが、完全を期すために、文字列を受け取って文字列を返す別のメソッドがあります。 Path.GetDirectoryName

string parent = System.IO.Path.GetDirectoryName(str_directory);
6
Carl Walsh

DirectoryInfo .Parentプロパティを調べてください。

3
ravuya

末尾の\に関する問題を回避するには、次のように呼び出します。

  string ParentFolder =  Directory.GetParent( folder.Trim('\\')).FullName;
2
A.D.

あなたはそれをしようとするべきではありません。 Environment.CurrentDirectoryは、実行可能ディレクトリのパスを提供します。これは、.exeファイルの場所に関係なく一貫しています。後方の相対位置にあると想定されるファイルにアクセスしようとしないでください

アクセスしたいリソースをローカルの場所に移動することをお勧めします。システムディレクトリ(AppDataなど)

1
musefan

これは最も一般的な方法です-実際に何をしているのかに本当に依存します:(説明するために、以下の例はあなたが要求した最後の10文字を削除しますが、あなたのニーズを推進しているビジネスルールがある場合特定の場所を見つけるには、他の場所を見つけて変更するのではなく、それらを使用してディレクトリの場所を取得する必要があります。

// remove last 10 characters from a string
str_directory = str_directory.Substring(0,str_directory.Length-10);
1
Hogan

クロスフォームで機能するソリューションを提供している人はいません。私はそれが特に尋ねられなかったことを知っていますが、私はLinux環境で働いており、ほとんどのソリューションは(これを投稿する時点で)エラーを提供します。

パスセパレーター(およびその他のもの)をハードコーディングすると、Windowsシステム以外でエラーが発生します。

私の元のソリューションで使用したもの:

char filesep = Path.DirectorySeparatorChar;
string datapath = $"..{filesep}..{filesep}";

ただし、ここでいくつかの答えを見た後、次のように調整しました。

string datapath = Directory.GetParent(Directory.GetParent(Directory.GetCurrentDirectory()).FullName).FullName; 
1
Madivad

ソリューションを取得するには、これを試してください

string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
0
Siby Sunny
IO.Path.GetFullPath(@"..\..")

bin\Debug\ "[プロジェクトのプロパティ]-> [ビルド]-> [出力パス]で、AppDomain.CurrentDomain.BaseDirectory

0
Slai