2012-06-14 14 views
13

Come posso determinare il percorso assoluto di un file o directory da un determinato percorso relativo in C/C++ su GNU/Linux?
So di realpath(), ma non funziona su file non esistenti.Come ottenere il percorso assoluto del file o della directory, che * non * esiste?

Diciamo che l'utente immette ../non-existant-directory/file.txt e che la directory di lavoro dei programmi è /home/user/.
Quello che mi serve è una funzione che restituisce /home/non-existant-directory/file.txt.

Ho bisogno di questa funzione per verificare se un determinato percorso si trova in una determinata sottodirectory o meno.

+0

Non penso che qualcosa del genere sia integrato. Dovrai scrivere il codice da solo. –

risposta

10

Prova realpath. Se non riesce, iniziare a rimuovere i componenti del percorso dalla fine uno alla volta e riprovare realpath finché non riesce. Quindi aggiungere i componenti rimossi sul risultato della chiamata con successo realpath.

Se sei sicuro che la directory che contiene esiste e vuoi solo creare un file, devi rimuovere almeno un componente.

Un altro approccio sarebbe solo creare prima il file, quindi chiamare realpath.

+0

la prima soluzione ha funzionato, grazie! –

0

Si potrebbe ottenere la directory corrente e applicare la seguente logica:

Se il percorso inizia con "/", sostituire la directory corrente con la radice

Per ogni directory indicata sul percorso relativo eseguire la seguente:

  • Se si è l'ultima parte del percorso relativo, aggiungerlo al percorso della directory corrente e fermarsi: il percorso della directory corrente è il percorso assoluto.

  • In caso contrario: verificare se esiste una directory nella directory corrente.

  • Se esiste, ma non è una directory, segnale di errore (a meno che l'ultima voce nel percorso)

  • Se esiste ed è una directory, vedere se si tratta di un link simbolico (su sistemi operativi che supportano questa funzione). Se sì, sostituire la directory corrente con la directory puntata del collegamento simbolico.

  • Se esiste, ed è una directory, ma non un collegamento simbolico, aggiungere questo elenco per il percorso della directory corrente (cioè sostituire la directory corrente con la sottodirectory selezionata)

  • Se non lo fa esiste, aggiungere le parti restanti del percorso relativo al percorso della directory corrente e fermarsi.

+2

Si tratta essenzialmente di reimplementare 'realpath' stesso e molto più lavoro del necessario. –

Problemi correlati