2012-11-14 9 views
16

Sto estraendo un percorso file da un database da utilizzare come origine file. Ho bisogno di rimuovere l'ultima cartella dal percorso di origine, quindi posso quindi creare nuove cartelle da utilizzare come percorso di destinazione.C#: È necessario rimuovere l'ultima cartella dal percorso del nome file

Esempio il percorso del file di origine: \\\\ServerName\\Documents\\MasterDocumentFolder\\

ho bisogno di rimuovere l'ultima cartella da quella stringa e ottenere questo: \\\\ServerName\\Documents\\

perciò in grado di creare una cartella come questo: \\\\ServerName\\Documents\\NewDocumentFolder1\\

Modifica: ho aggiornato i miei percorsi di esempio per mostrare perché Path.GetDirectoryName() non funzionerà in questo caso.

+0

Le stringhe tornano dal database con tutte le barre raddoppiate? O è proprio quello che stai osservando nel debugger (che è normale)? –

+0

possibile duplicato di [Rimuovere una directory dal percorso completo della directory] (http://stackoverflow.com/questions/6098209/remove-one-directory-from-full-directory-path) –

risposta

26

Quello che state cercando è il metodo GetParent() nella classe Directory

string path = @"C:\Documents\MasterDocumentFolder\"; 
DirectoryInfo parentDir = Directory.GetParent(path); 
// or possibly 
DirectoryInfo parentDir = Directory.GetParent(path.EndsWith("\\") ? path : string.Concat(path, "\\")); 

// The result is available here 
var myParentDir = parentDir.Parent.FullName 
+0

Risultato in 'C: \ Documents \ MasterDocumentFolder' –

+0

No, risulta in un oggetto che è possibile eseguire il rendering in base a quanto dichiarato, ma contiene anche la proprietà Parent. –

+1

'GetParent()' recupera la directory principale. Solo con il trailing \ non funziona come previsto. Quindi o trascini il trailing \ o usi il 'Parent' per salire di un altro. In entrambi i casi, la tua risposta non produce il risultato corretto. –

7

Questo è brutto, ma funziona

string path = @"C:\Documents\MasterDocumentFolder\file.any"; 
var lastFolder = Path.GetDirectoryName(path); 
var pathWithoutLastFolder = Path.GetDirectoryName(lastFolder); 

Ma se si dispone di meno di un livello di directory (radice dell'unità), quindi pathWithoutLastFolder sarà null, in modo da avere a che fare con esso.

+0

A meno che non disponga di un percorso completo (incluso il nome file) quindi sarebbe richiesto un solo 'Path.GetDirecotyrName()'. –

+0

Ho aggiornato i miei percorsi di esempio per mostrare perché quel metodo non funziona per me. C'è un ulteriore passaggio per convertire \\ in \? – Mick

+0

Questa non è una buona pratica, utilizzare DirectoryInfo.Parent invece –

1

Hai provato a dividere la stringa per "\", e quindi a ricostruire un nuovo percorso unendo ogni elemento ma l'ultimo?

È inoltre necessario considerare il caso in cui il percorso originale si trova nella radice e quando finisce in una barra rovesciata o meno.

+2

Non vale niente, ma non è molto buono C# pratica –

+3

.net include lo spazio dei nomi System.IO e il percorso oggetto per questo motivo. –

2

Questo dovrebbe spiegare il percorso essendo un file o una directory

DirectoryInfo parent = null; 
if (File.Exists(path)) 
{ 
    parent = new FileInfo(path).Directory.Directory 
} 
if(Directory.Exists(path)) 
{ 
    parent = new DirectoryInfo(path).Directory; 
} 
+0

La tua espressione dovrebbe forse includere DirectoryInfo.Exists? –

0

System.IO.DirectoryInfo è probabilmente il più pulito modo per realizzare ciò che stai chiedendo.

var path = "\\\\ServerName\\Documents\\MasterDocumentFolder\\"; 
string newPath = new DirectoryInfo(path).Parent.CreateSubdirectory("NewDocumentFolder1").FullName; 
Console.WriteLine(newPath.FullName); 
//> "\\ServerName\Documents\NewDocumentFolder1\" 

Nota che DirectoryInfo non richiede una directory accessibile esistente o:

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn"); 
Console.WriteLine(dir.Exists); 
//> False 

Ma facendo attenzione che esiste è un gioco da ragazzi

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\Mn"); 
dir.Create(); 
Console.WriteLine(dir.Exists); 
//> True 

Sarà anche fare cose eccezionali come determinazione relativa percorsi:

var dir = new DirectoryInfo(@"C:\Asdf\Qwer\Zxcv\Poiu\Lkj\..\..\..\Mn"); 
Console.WriteLine(dir.FullName); 
//> C:\Asdf\Qwer\Mn 

Per quanto riguarda le altre risposte taglio e accodamento barre, notare la differenza di comportamento tra Directory.GetParent ("... \") e DirectoryInfo ("... \"). Parent quando si tratta di trailing \ 's - DirectoryInfo è più coerente:

Console.WriteLine(Directory.GetParent(@"C:\Temp\Test").FullName); 
//> C:\Temp 
Console.WriteLine(Directory.GetParent(@"C:\Temp\Test\").FullName); 
//> C:\Temp\Test 
Console.WriteLine(new DirectoryInfo(@"C:\Temp\Test").Parent.FullName); 
//> C:\Temp 
Console.WriteLine(new DirectoryInfo(@"C:\Temp\Test\").Parent.FullName); 
//> C:\Temp 

Anche in questo caso, per evitare di trattare con slash, utilizzare sempre Path.Combine() per concatenare i percorsi ei nomi dei file.Sarà gestire i percorsi in modo corretto se contengono un finale \ o no:

Console.WriteLine(Path.Combine(@"C:\Temp\Test\", "Test.txt")); 
//> C:\Temp\Test\Test.txt 
Console.WriteLine(Path.Combine(@"C:\Temp\Test", "Test.txt")); 
//> C:\Temp\Test\Test.txt 
Console.WriteLine(Path.Combine(@"C:\", "Temp", "Test", "Test.txt")); 
//> C:\Temp\Test\Test.txt 
0

Con questo metodo è possibile creare dir dal dirPath (se dir non è esiste) e per creare directory dalla filePath se necessario

private void CreateDirIfNotExist(string dirPath, bool removeFilename = false) 
     { 
      if (removeFilename) 
      { 
       dirPath = Directory.GetParent(dirPath).FullName; 
      } 

      if (!Directory.Exists(dirPath)) 
      { 
       Directory.CreateDirectory(dirPath); 
      } 
     } 
Problemi correlati