2013-07-16 11 views
5

Ho bisogno di estrarre le estensioni dai nomi dei file.Ottieni estensione file per casi speciali come tar.gz

So che questo può essere fatto per le estensioni singoli come .gz o .tar utilizzando filePath.lastIndexOf('.') o utilizzando metodi di utilità come FilenameUtils.getExtension(filePath) da Apache commons-io.

Ma, cosa succede se ho un file con un'estensione come .tar.gz? Come posso gestire i file con estensioni contenenti caratteri .?

+4

In realtà, l'estensione non è '.tar.gz'. L'estensione - per definizione - è '.gz'. La parte '.tar' è solo a scopo informativo. Se il file termina con '.test.zip', considereresti l'estensione' .zip', vero? –

+1

e 'commons-io-2.4.jar' in questo caso cosa ti aspetteresti? – vels4j

+0

@ThorstenDittmar È ancora ragionevole gestire * .tar.gz ragionevole, proprio come * .tgz, intendiamoci. – Ingo

risposta

3

Se sai quali estensioni sono importanti, puoi semplicemente controllarle esplicitamente. Si avrebbe una collezione di estensioni note, in questo modo:

List<String> EXTS = Arrays.asList("tar.gz", "tgz", "gz", "zip"); 

Si potrebbe ottenere il (primo) più lunga estensione corrispondente in questo modo:

String getExtension(String fileName) { 
    String found = null; 
    for (String ext : EXTS) { 
    if (fileName.endsWith("." + ext)) { 
     if (found == null || found.length() < ext.length()) { 
     found = ext; 
     } 
    } 
    } 
    return found; 
} 

Quindi chiamando getExtension("file.tar.gz") sarebbe tornato "tar.gz".

Se si hanno nomi di maiuscole e minuscole, provare a cambiare il segno di spunta in filename.toLowerCase().endsWith("." + ext) all'interno del ciclo.

0

Trovato in modo semplice. Utilizzare substring per ottenere solo il nome file e indexOf anziché lastIndexOf per ottenere il primo '.' e l'estensione dopo di esso

+2

Quindi, quale sarebbe il tuo programma prendere in considerazione l'estensione se ti dessi un file 'program.logs.tar.gz'? –

+0

D'accordo, questo non funzionerà con file con numeri di versione incorporati in essi. – grkvlt

0

È possibile ottenere la parte nome file del percorso, dividere su . e prendere gli ultimi 0, 1 o 2 elementi dell'array come estensione.

Naturalmente se .tar.* (gz, bz2, ecc.) È l'unico caso limite, potrebbe essere pragmatico solo creare una soluzione che filtra i nomi di file per .tar. e usalo come punto in cui estrarre l'estensione (per includere la parte .tar).

2

Un file può avere solo un'estensione!

Se si dispone di un file test.tar.gz,

  • .gz è l'estensione e
  • test.tar è il nome base!

.tar in questo caso è parte del basename, non la parte dell'estensione!

Se si desidera avere un file codificato come tar e gz, è necessario chiamarlo .tgz. Per utilizzare uno .tar.gz è una cattiva pratica, se hai bisogno di gestire i file thesse dovresti fare una soluzione, come rinominare il file in test.tgz.

+1

Inizia a differire: "l'estensione" è qualsiasi cosa l'abbia definita. Dal punto di vista del sistema operativo non esiste una "estensione". – Ingo

+0

Un sistema operativo pov, hm ... è forse più risparmi da dire da FS pov. –

Problemi correlati