2013-04-17 12 views
10

Come posso ottenere la directory principale di una cartella +1?Ottieni la directory principale di una cartella +1

Esempio: Ingresso: C:\Level1\Level2\level3 uscita dovrebbe essere:

Level1 

Se l'ingresso è Level1 uscita dovrebbe essere Level1

se l'ingresso è C: \ uscita dovrebbe essere empty string

Is c'è una funzione. NET gestisce questo?

volontà restituisce sempre C:\

+3

No, non esiste una funzione incorporata per gestire questo. –

risposta

11

È possibile utilizzare la classe Path + Substring + Split per rimuovere la radice e ottenere la cartella superiore.

// your directory: 
string dir = @"C:\Level1\Level2\level3";  

// C:\ 
string root = Path.GetPathRoot(dir); 

// Level1\Level2\level3: 
string pathWithoutRoot = dir.Substring(root.Length);  

// Level1 
string firstFolder = pathWithoutRoot.Split(Path.DirectorySeparatorChar).First(); 

Un altro modo è usare la classe DirectoryInfo ed è Parent proprietà:

DirectoryInfo directory = new DirectoryInfo(@"C:\Level1\Level2\level3"); 
string firstFolder = directory.Name; 
while (directory.Parent != null && directory.Parent.Name != directory.Root.Name) 
{ 
    firstFolder = directory.Parent.Name; 
    directory = directory.Parent; 
} 

Tuttavia, preferirei i "leggeri" metodi di stringa.

0

Una possibile soluzione, ma non può essere la migliore, è quello di trovare la posizione di @ "\", e fare un po 'manuale di elaborazione da soli. Sotto codice non è completamente testato, solo frammento:

//var positions = inputString.IndexOfAny(new [] {'\'}); //Original one 
//Updated, thanks to Snixtor's implementation 
var positions = inputString.IndexOfAny(new [] {Path.DirectorySeparatorChar}); 
int n=positions.Length; 
if(n>=1) 
{ 
    var pos = positions[1]; //The 2nd '\'; 
    return inputString.SubString(0, pos); 
} 
return null; 

Naturalmente, questo funziona solo se siamo sicuri che vogliamo tagliare sottostringhe dopo il 2 ° '\'.

+0

Cosa succede se l'input usa '/'? –

+0

new [] {'\', '/', ... 'altri', ...}) – David

1

Non è sicuro se questo è il modo corretto, ma si fa:

string s = @"C:\Level1\Level2\Level3"; 
string foo = s.split(@"\")[1]; 

Non è sicuro se oggetto DirectoryInfo può ottenere questo in un modo più pulito ..

DirectoryInfo di = new DirectoryInfo(@"C:\Level1\Level2\Level3"); 
di.Root; 
+2

'di.Root' restituirà" C: \ ". –

4
string dir = @"C:\foo\bar\woah"; 
var dirSegments = dir.Split(new char[] { Path.DirectorySeparatorChar }, 
          StringSplitOptions.RemoveEmptyEntries); 
if (dirSegments.Length == 1) 
{ 
    return string.Empty; 
} 
else 
{ 
    return dirSegments[0] + Path.DirectorySeparatorChar + dirSegments[1]; 
} 
+0

Ah, a tutti noi piace una sfida di codifica rapida, no? 4 risposte tutte entro 4 minuti :) – Snixtor

+0

Ragazzi siete troppo veloci ...: P –

+0

Dovreste includere anche 'AltDirectorySeparatorChar'. –

0

Si potrebbe ad anello utilizzando la classe di informazioni sulla directory utilizzando la seguente struttura aggiungendo la sezione di codice in un metodo

string path = "C:\Level1\Level2\level3"; 
DirectoryInfo d = new DirectoryInfo(path); 
while (d.Parent.FullName != Path.GetPathRoot(path)) 
{ 
    d = d.Parent; 
} 
return d.FullName; 
0

Un felice LINQ uno di linea:

string level1_2 = Directory.GetDirectoryRoot(path) + path.Split(Path.DirectorySeparatorChar).Skip(1).Take(1).DefaultIfEmpty("").First(); 
+0

Oh, ho appena notato che il primo fallisce se è solo @ "C: \ Level1", quindi l'ho rimosso. –

0
var di = new System.IO.DirectoryInfo(@"C:\a\b\c"); 
    Func<DirectoryInfo, DirectoryInfo> root = null; 
    root = (info) => info.Parent.FullName.EndsWith("\\") ? info : root(info.Parent); 
    var rootName = root(di).Name; //#a 
0

perché non utilizzare System.IO.Path per recuperare il nome?

MessageBox.Show(System.IO.Path.GetFileName(
    System.IO.Path.GetDirectoryName(
     System.IO.Path.GetDirectoryName(@"C:\Level1\Level2\Level3") 
    ) 
)); 

Restituisce Level 1.

MessageBox.Show(System.IO.Path.GetFileName(
    System.IO.Path.GetDirectoryName(
     System.IO.Path.GetDirectoryName(@"C:\") 
    ) 
)); 

Restituisce una stringa vuota.

1

È possibile utilizzare DirectoryInfo e un ciclo while.

DirectoryInfo info = new DirectoryInfo(path); 
while (info.Parent != null && info.Parent.Parent != null) 
    info = info.Parent; 
string result = info.FullName; 
Problemi correlati