Newsgroup: it.comp.os.linux.development
Titolo: Re: filename e estensione in C

 non "tar.gz"), 
Infatti l'estensione di abc.tar.gz è "gz". Tornare la stringa a partire 
dall'ultimo punto è l'unica soluzione sensata.
E.

 non "tar.gz"),
e invece è giusto, un file .tar.gz è un file .gz, punto.
Solo dopo che gli hai tolto la compressione diventa un tar,ma questo vae
per ogni file gz, dopo la decompressione divent nu file di un altro tipo,
ma fino a quando è compresso è SOLO un file compresso.
poi in ogni caso sai bene che in linux l'estensione conta ben poco, per
sapere il tipo di file dovresti guardarti i sorgenti di "file" e vedre che
succede

 abc.provanumero2.txt (ritornerebbe 2provanumero2.txt" e non "txt").
Devi definire cosa intendi per "estensione" altrimenti non riesci ad 
isolarla.

 Grazie!
Puoi fare in vari modi.
Come prima cosa puoi provare ad imporre alcune regole, ad esempio che 
come estensione non puoi avere solo numeri (così ti togli i casi del tipo 
abc_1.0.3.txt) e accontentarti dell'estensione lunga 3 caratteri se 
presente e solo se non è così cercare ancora (es: file abc.manifest, 
"manifest" è più lungo di 3 caratteri, cerchi altri punti ma c'è solo 
quello, quindi "manifest" è l'estensione; altro es: abc.tar.gz, "gz" è 
lungo 2 e quindi cerchi un'altra estensione lunga 3 e la unisci al "gz" 
così trovi tar.gz).
Poi ovviamente ci sono le eccezioni e potresti quindi farti degli elenchi 
e controllare in quelli. Oppure non so...
Saluti confusi

 [...]
Ciao  Manlio Perillo

 abc.provanumero2.txt (ritornerebbe 2provanumero2.txt" e non "txt").
Appunto: in base a quale criterio nel primo caso l'estensione prende
due punti e nel secondo solo l'ultimo?
Se proprio ti serve una funzione che discrimini  i due casi devi
fornirgli una lista delle estensioni che vanno considerate anceh
come penultima parte (il .tar del tuo primo esempio)
ciao
Giacomo

 
utilizza una mappa delle estenzioni note, se il pattern matching 
fallisce utilizzi le cifre dall'ultimo punto della stringa.
michelangelo

 separa nome da estensione):
Usa le funzioni di ricerca partendo dal fondo della stringa :
es. strrchr ( "pippo.ini.pippo.txt", '.' );
Luca

 presente e solo se non è così cercare ancora (es: file abc.manifest,
.html
.jpeg
.docx
.info
:)
No, secondo me deve prima definire cosa intende per estensione e poi 
trovarla.
Sono d'accordo con Giacomo e Michelangelo.
Dovrebbe farsi una lista di eccezioni. Per esempio, se trova .gz o .bz2 
controlla che prima ci sia .tar e in caso estende l'indice, altrimenti 
ritorna l'estensione normale.
Bye.

 .info
Cavoli! Sapevo che mi sarei scordato qualcosa! Comunque sia può 
controllare 3 e 4 e non di più...

 
Bhè, nei casi esposti sopra tu come distingui dove inizia l'estensione?
Io penso che sia una cosa possibile solo perche` tu _conosci_ le estensioni.
Le estensioni non sono una cosa standard, quindi non so proprio come
individuarle :P

 
Le estensioni dei files hanno senso quando queste sono in qualche modo 
interpretate come tali dal sistema operativo. Ad esempio le vecchie 
versioni di FAT avevano uno spazio di 3 bytes riservato all'estensione 
di ciascun file.
Nei filesystem moderni il significato delle estensioni si è parzialmente 
perso, pertanto è comune trovare estensioni maggiori di 3 caratteri o 
complesse tipo: .jpeg .html .tar.bz2 .estensionegenerica.Z e altre simili.
Un approccio comune potrebbe essere quello di prelevare la stringa 
successiva all'ultimo carattere "." del path, confrontarla con un 
piccolo database ed eventualmente cercare una seconda estensione, 
compresa tra i due caratteri "." finali del path.
In parole povere:
Es.1) path = /home/you/filename.tar.gz
trovo "gz", effettuo una ricerca in un database (anche un semplice array 
ordinato può andar bene):
bz2
gz
Z
pkg
trovato "gz" nel database, cerco l'estensione precedente "tar"
restituisco l'estensione "tar.gz"
Es.2) path = /home/you/filename.tar.mp3
trovo "mp3", effettuo una ricerca nel database:
bz2
gz
Z
pkg
non ho trovato "mp3" nel database restituisco l'estensione "mp3"
Spero di essere stato d'aiuto ;)

 michelangelo
Qusta e' cio' che si chiama lookup table e secondo me' e' una delle 
poche risposte se non l'unica a tale problema. A suo tempo l'avevo 
utilizzata per scoprire il tipo delle varie carte di credito (Es. Visa, 
Mastercard, Amex, JCB, Diners etc.). I loro numeri cominciano con 
pattern di 4 o 3 o anche 2 cifre e l'unico modo per riconoscerle e' 
passare per una lookup table. La mia funzione partiva cercando dapprima 
i pattern piu' lunghi e quindi 4 cifre e man mano scendeva a quelli con 
meno cifre. Nel mio caso se non trovava il pattern lil numero carta era 
fasullo. Passando al caso delle estensioni si puo' operare in modo 
analogo partendo da estensioni con piu' caratteri esempio cercare prima 
".tar.gz". Le tabella delle estensioni di lookup la caricherei da un 
file esterno, aggiornandolo anche in automatico con estensioni non 
trovate chiedendo eventualmente conferma.
Spero di essere riuscito a farmi capire.
Ciao
UB
-- 
U'll neva get 2 heaven if ur scared of gettin high

 
Guarda che nella tabella di lookup nessuno ti vieta di metterci dentro 
anche le estansioni di tipo .tar.gz riconoscendole perfettamente. Il 
motivo della lookup e' proprio quello.
