Come navigare in alcune cartelle?


115

Un'opzione potrebbe essere quella di eseguire System.IO.Directory.GetParent () alcune volte. Esiste un modo più grazioso di spostarsi di alcune cartelle da dove risiede l'assembly in esecuzione?

Quello che cerco di fare è trovare un file di testo che risiede in una cartella sopra la cartella dell'applicazione. Ma l'assieme stesso è all'interno del cestino, che si trova in alcune cartelle nella cartella dell'applicazione.


2
di solito un percorso relativo fa il trucco come '.. \ .. \ .. \ .. \ Downfolder' ma dipende da cosa stai cercando di fare esattamente per ...?
DiskJunky

è sempre così?
CR41G14

4
"Navigare" come? Intendi la directory corrente? Se è così, dovresti essere in grado di farloDirectory.SetCurrentDirectory(@"..\..\..\..");
Peter Ritchie

Risposte:


211

Un altro modo semplice è farlo:

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

Nota Questo sale di due livelli. Il risultato sarebbe: newPath = @"C:\Folder1\Folder2\";


18
Non ha senso usare Path.Combinequando si aggiunge comunque il backslash manualmente. Considera l'utilizzo Path.Combine(path, "..", "..")invece.
AXMIM

32

se c: \ cartella1 \ cartella2 \ cartella3 \ bin è il percorso, il seguente codice restituirà la cartella di base del percorso della cartella bin

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

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

vale a dire, c: \ cartella1 \ cartella2 \ folder3

se vuoi il percorso cartella2, puoi ottenere la directory da

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

quindi otterrai il percorso come c: \ cartella1 \ cartella2 \


12

Puoi usarlo ..\pathper salire di un livello, ..\..\pathper salire di due livelli rispetto al percorso.

Puoi usare Pathanche la lezione.

Classe Path C #


6

Questo è ciò che ha funzionato meglio per me:

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

Ottenere il percorso "giusto" non era il problema, aggiungere "../" ovviamente lo fa, ma dopo di ciò, la stringa data non è utilizzabile, perché aggiungerà semplicemente "../" alla fine. Circondarlo Path.GetFullPath()vi darà il percorso assoluto, rendendolo utilizzabile.


4

Il metodo seguente ricerca un file che inizia con il percorso di avvio dell'applicazione (cartella * .exe). Se il file non viene trovato lì, viene eseguita la ricerca nelle cartelle principali finché non viene trovato il file o viene raggiunta la cartella principale. nullviene restituito se il file non è stato trovato.

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;
}

Nota: Application.StartupPathviene solitamente utilizzato nelle applicazioni WinForms, ma funziona anche nelle applicazioni console; tuttavia, sarà necessario impostare un riferimento System.Windows.Formsall'assembly. Puoi sostituire Application.StartupPathcon
Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location)se preferisci.


4

Forse potresti usare una funzione se vuoi dichiarare il numero di livelli e metterlo in una funzione?

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

E potresti chiamarlo così:

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

2

C #

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

1

questo può aiutare

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

1

Ho alcune directory virtuali e non posso usare i metodi Directory. Quindi, ho creato una semplice funzione di divisione / unione per coloro che sono interessati. Non così sicuro però.

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

Quindi, se vuoi spostare 4 in su, devi solo cambiare il 1a 4e aggiungere alcuni controlli per evitare eccezioni.


0

Se conosci la cartella in cui vuoi navigare, trova l'indice e poi la sottostringa.

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

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

2
Questo fallisce in tanti casi. E se il nome della cartella fosse solo a, per esempio? E se il percorso fosse così C:\Folderame3\Folderame2\Folderame\...?
41686d6564

se il nome della cartella è solo una ricerca "\\ a \\" o \\ a se è l'ultima
Taran
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.