1つのオプションは、System.IO.Directory.GetParent()を数回実行することです。実行中のアセンブリが存在する場所からいくつかのフォルダを移動するより優雅な方法はありますか?
私がやろうとしているのは、アプリケーションフォルダーの1つ上のフォルダーにあるテキストファイルを見つけることです。ただし、アセンブリ自体はビン内にあります。ビンは、アプリケーションフォルダー内のいくつかのフォルダーです。
他の簡単な方法はこれを行うことです:
string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));
注これは2レベル上がります。結果は次のようになります:newPath = @"C:\Folder1\Folder2\";
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 \として取得します
これは私にとって最もうまくいったものです:
string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../"));
「正しい」パスを取得することは問題ではなく、「../」を追加することは明らかにそれを行いますが、その後、指定された文字列は最後に「../」を追加するだけなので使用できません。 Path.GetFullPath()
で囲むと絶対パスが得られ、使用可能になります。
次のメソッドは、アプリケーションのスタートアップパス(* .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);
これは役立つかもしれません
string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
// file found
}
ナビゲートしたいフォルダがわかっている場合は、そのインデックスを見つけてからサブストリングを見つけます。
var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");
string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
仮想ディレクトリがいくつかあり、ディレクトリメソッドを使用できません。そこで、興味のある人のために単純な分割/結合関数を作成しました。しかし、それほど安全ではありません。
var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());
したがって、4つ上に移動する場合は、1
を4
に変更し、いくつかのチェックを追加して例外を回避する必要があります。