2010-06-14 18 views
5

Dire che c'è un file chiamato 12345.jpg. In C, come posso ottenere l'estensione del file in modo da poter confrontare con qualche estensione di file? Se ci sono alcune funzioni incorporate, per favore fatemelo sapere.Estensione del file in linguaggio C

+0

[SO 290488] (http://stackoverflow.com/questions/290488) copre molto lo stesso terreno. –

+0

Quindi questo - http://stackoverflow.com/questions/51949/how-to-get-file-extension-from-string-in-c –

+0

Possibile duplicato di [Ottenere estensione file in C] (http: // stackoverflow.com/questions/5309471/getting-file-extension-in-c) – nibot

risposta

5

Probabilmente:

#include <string.h> 

char *extn = strrchr(filename, '.'); 

che vi darà un puntatore al periodo della proroga, o un puntatore nullo se non v'è alcuna estensione. Potrebbe essere necessario fare un po 'di due diligence per garantire che non ci sia una barra dopo il punto, tra le altre cose.

+3

'strrchr (nomefile + 1, '.');' gestirà nomi come '.svn' che iniziano con un punto ma non hanno estensione. – drawnonward

+0

@drawnonward - indubbiamente, se si considera che è un nome di file senza estensione, piuttosto che un'estensione senza nome. Questo è un altro dei casi di "dovuta diligenza" da considerare. Tuttavia, se l'OP sta cercando di confrontare l'estensione trovata con una lista abbastanza breve di estensioni conosciute, allora il fatto che '.svn' non sia nella lista significa che probabilmente non avrà importanza. –

+0

@drawnonward: ho interpretato erroneamente ciò che stavi dicendo: tu fai un punto valido. Tuttavia, questo non sarebbe d'aiuto con nomi di percorso assoluti che iniziano con un '/', o nomi relativi contenenti una barra ('sottodir/.svn'). C'è un motivo per dire che devi trovare l'inizio del nome base del file (dopo l'ultima barra, ma devi preoccuparti delle barre e radici finali) e quindi cercare un punto non nella prima posizione. Immagino che ciò significhi che la directory genitore '..' ha il nome 'punto' seguito da un'estensione che inizia con un punto e nient'altro ... Di solito c'è un'altra sfera curva da affrontare. –

-1

Usa strchr primo membro di matrice vi darà il nome del file secondo membro di matrice vi darà estensione

+0

Puoi approfondire questo? –

+0

Non dimenticare un nome di file come 'this.uses.many.periods.jpg' –

8

Una funzione di farlo, insieme a un test harness:

#include <stdio.h> 
#include <string.h> 

const char *getExt (const char *fspec) { 
    char *e = strrchr (fspec, '.'); 
    if (e == NULL) 
     e = ""; // fast method, could also use &(fspec[strlen(fspec)]). 
    return e; 
} 

int main (int argc, char *argv[]) { 
    int i; 
    for (i = 1; i < argc; i++) { 
     printf ("[%s] - > [%s]\n", argv[i], getExt (argv[i])); 
    } 
    return 0; 
} 

L'esecuzione di questo con:

./program abc abc. abc.1 .xyz abc.def abc.def.ghi 

ti dà:

[abc] - > [] 
[abc.] - > [.] 
[abc.1] - > [.1] 
[.xyz] - > [.xyz] 
[abc.def] - > [.def] 
[abc.def.ghi] - > [.ghi] 
+0

+1 per' strrchr'. Il miglior metodo per trovare l'ultima istanza di un carattere in una stringa. – tomlogic

+0

Nel caso in cui qualcuno lo manchi. 'getExt()' presuppone che 'fspec' sia un nome di base, non un percorso completo. Prendi in considerazione per esempio "my.dir/file". Utilizzare 'basename()' per ottenere il nome base da un percorso completo. –

2

C'è una soluzione CRT portatile: _splitpath.

In Windows esiste anche un'API shell32 non documentata denominata PathGetExtension, ma questo è il male in tanti modi che probabilmente non avrei dovuto notare.

+6

Questa è ovviamente una nuova definizione della parola "portatile" di cui ero precedentemente inconsapevole :-) Con scuse a Douglas Adams della fama di HHGTTG. – paxdiablo

+4

Infatti, non ho mai visto la parola "portatile" e un link a msdn nella stessa frase :-) – Job

+2

Il mio male, il mio male! Non modificare la risposta, per gli altri di godere :) –

Problemi correlati