2013-02-01 22 views
6

Ho il nome completo del percorso di una determinata cartella per es.Manipolazione del percorso della directory in Delfi?

c:\foo\bar 

Ora vorrei fare riferimento a un file all'interno di C: \ foo nome baz.txt,

c:\foo\bar\..\baz.txt 

Attualmente sto usando l'operatore .. percorso per scendere di un livello e ottenere il file di cui ho bisogno.

Esiste una funzione che può eseguire manipolazioni di percorso, ad es. UpOneLevel (str) -> str? So di poterne scrivere uno dividendo la stringa e rimuovendo l'ultimo token, ma preferirei che fosse una funzione built-in/library, quindi non mi caccerò più tardi se ci sono, ad es. backslash sfuggiti.

+0

Quale versione di Delphi? La versione recente ha l'unità 'IOUtils', che potrebbe avere la funzionalità che stai cercando; sarebbe inutile postare qualcosa da questo per una risposta se stai usando una versione molto precedente di Delphi. Probabilmente dovresti aggiungere un tag specifico per la versione (ad es., 'Delphi-2007',' delphi-xe3' o qualsiasi altra cosa sia applicabile) agli altri tag che hai usato. –

+0

@KenWhite È per delphi-2007, sono sfortunato? – wmercer

+2

Certo che no. :-) La risposta potrebbe essere diversa, ma tutto è ancora possibile. –

risposta

11

utilizzare la funzione ExpandFileName:

var 
    S: string; 
begin 
    S := 'c:\foo\bar\..'; 
    S := ExpandFileName(S); 
    ShowMessage(S); 
end; 

Il messaggio dall'esempio precedente mostrerà il percorso c:\foo.

+3

+1. Bel lavoro: ho ricevuto una telefonata e l'hai risolto prima che potessi tornare indietro. :-) –

2

Questa risposta è valida per Delphi XE +

Utilizzare la classe TDirectory dell'unità IOutils, che hanno il metodo GetParent, come questo ::

uses IOUtils; 

procedure TForm1.Button1Click(Sender: TObject); 
var 
    s: string; 
begin 
    s := 'c:\foo\bar'; 
    ShowMessage(TDirectory.GetParent(s)); 
end; 

Nelle versioni più vecchie

Guarda le altre risposte.

+0

IOUtils non trovato, sto usando Delphi-2007. – wmercer

+0

La domanda è chiaramente contrassegnata 'delphi-2007', che non include' IOUtils'. (Ho menzionato questo nel mio commento alla domanda originale.) Non downvoting, ma solo menzionando. :-) –

+2

Questa è la migliore risposta per le versioni moderne di Delphi, quindi, per favore non cancellatela (e votate!) Il rischio con vecchie domande come questa è che le persone usano la risposta corretta quando devono usare qualcos'altro. –

4

Vedere ExtractFilePath() e ExtractFileDir(). Questi sono disponibili in quasi tutte le versioni di Delphi, in particolare quelli che non hanno TDirectory, IOUtils, ecc.

E prima che qualcuno lo dica, questi funzionano bene se il percorso termina con un nome di file o meno. ForceDirectories() li utilizza internamente per andare a ritroso attraverso una gerarchia di cartelle padre, ad esempio.

1

È possibile dare un'occhiata al record TPathBuilder nell'unità SvClasses dalla libreria delphi-oop. Questa unità non supporta Delphi 2007 ma l'implementazione TPathBuilder è compatibile con questa versione di Delphi. Esempio di utilizzo:

var 
    LFullPath: string; 
begin 
    LFullPath := TPathBuilder.InitCustomPath('c:\foo\bar').GoUpFolder.AddFile('baz.txt').ToString; 
    //LFullPath = c:\foo\baz.txt 
Problemi correlati