Une option serait de faire System.IO.Directory.GetParent () plusieurs fois. Existe-t-il un moyen plus élégant de parcourir quelques dossiers à partir de l’Assemblée exécutante?
Ce que j'essaie de faire est de trouver un fichier texte qui réside dans un dossier au-dessus du dossier de l'application. Mais l’Assemblée elle-même se trouve à l’intérieur de la corbeille, qui contient quelques dossiers situés dans le dossier de l’application.
Une autre façon simple est de faire ceci:
string path = @"C:\Folder1\Folder2\Folder3\Folder4";
string newPath = Path.GetFullPath(Path.Combine(path, @"..\..\"));
Remarque Ceci monte de deux niveaux. Le résultat serait: newPath = @"C:\Folder1\Folder2\";
si c:\folder1\folder2\folder3\bin est le chemin, le code suivant renvoie le dossier de base du dossier bin
string directory=System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString());
c'est-à-dire, c:\dossier1\dossier2\dossier3
si vous voulez le chemin folder2, alors vous pouvez obtenir le répertoire en
string directory = System.IO.Directory.GetParent(System.IO.Directory.GetParent(Environment.CurrentDirectory).ToString()).ToString();
alors vous obtiendrez chemin comme c:\folder1\folder2 \
Vous pouvez utiliser ..\path
pour monter d'un niveau, ..\..\path
pour passer d'un niveau à l'autre.
Vous pouvez également utiliser la classe Path
.
La méthode suivante recherche un fichier commençant par le chemin de démarrage de l'application (dossier * .exe). Si le fichier n'y est pas trouvé, les dossiers parents sont recherchés jusqu'à ce que le fichier soit trouvé ou que le dossier racine soit atteint. null
est renvoyé si le fichier n'a pas été trouvé.
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;
}
Remarque: Application.StartupPath
est généralement utilisé dans les applications WinForms, mais il fonctionne également dans les applications de console. Cependant, vous devrez définir une référence à l'assembly System.Windows.Forms
. Vous pouvez remplacer Application.StartupPath
parPath.GetDirectoryName(Assembly.GetExecutingAssembly().Location)
si vous préférez.
cela peut aider
string parentOfStartupPath = Path.GetFullPath(Path.Combine(Application.StartupPath, @"../../")) + "Orders.xml";
if (File.Exists(parentOfStartupPath))
{
// file found
}
Peut-être que vous pourriez utiliser une fonction si vous voulez déclarer le nombre de niveaux et le mettre dans une fonction?
private String GetParents(Int32 noOfLevels, String currentpath)
{
String path = "";
for(int i=0; i< noOfLevels; i++)
{
path += @"..\";
}
path += currentpath;
return path;
}
Et vous pourriez l'appeler comme ça:
String path = this.GetParents(4, currentpath);
Si vous connaissez le dossier vers lequel vous souhaitez naviguer, recherchez son index puis sous-chaîne.
var ind = Directory.GetCurrentDirectory().ToString().IndexOf("Folderame");
string productFolder = Directory.GetCurrentDirectory().ToString().Substring(0, ind);
J'ai des répertoires virtuels et je ne peux pas utiliser les méthodes de répertoire. J'ai donc créé une fonction simple de scission/jointure pour les personnes intéressées. Pas aussi sûr cependant.
var splitResult = filePath.Split(new[] {'/', '\\'}, StringSplitOptions.RemoveEmptyEntries);
var newFilePath = Path.Combine(filePath.Take(splitResult.Length - 1).ToArray());
Donc, si vous voulez passer à 4, il vous suffit de changer le 1
en 4
et d'ajouter des vérifications pour éviter les exceptions.