2013-07-16 7 views
5

Ich muss Erweiterungen aus Dateinamen extrahieren.Get File Extension für spezielle Fälle wie tar.gz

Ich weiß, das durch filePath.lastIndexOf('.') mit für einzelne Erweiterungen wie .gz oder .tar getan werden kann, oder mit Hilfsmethoden wie FilenameUtils.getExtension(filePath) von Apache commons-io.

Aber, was passiert, wenn ich eine Datei mit einer Erweiterung wie .tar.gz habe? Wie kann ich Dateien mit Erweiterungen verwalten, die . Zeichen enthalten?

+4

Eigentlich ist die Erweiterung nicht '.tar.gz'. Die Erweiterung - per Definition - ist '.gz'. Der '.tar' Teil dient nur zu Informationszwecken. Wenn die Datei mit '.test.zip 'endet, würden Sie die Erweiterung' .zip' betrachten, oder? –

+1

und 'commons-io-2.4.jar' in diesem Fall, was Sie erwarten würden? – vels4j

+0

@ThorstenDittmar Es ist immer noch vernünftig, * .tar.gz vernünftig zu behandeln, genau wie * .tgz, wohlgemerkt. – Ingo

Antwort

3

Wenn Sie wissen, welche Erweiterungen wichtig sind, können Sie einfach explizit nach ihnen suchen. Sie würden eine Sammlung von bekannten Erweiterungen haben, wie folgt aus:

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

Sie konnten die (erste) längste passende Erweiterung wie diese:

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; 
} 

So getExtension("file.tar.gz") Aufruf "tar.gz" zurückkehren würde.

Wenn Sie Namen in Groß- und Kleinschreibung haben, versuchen Sie vielleicht, die Überprüfung innerhalb der Schleife auf filename.toLowerCase().endsWith("." + ext) zu ändern.

0

Einen einfachen Weg gefunden. Verwenden Sie substring, um nur den Dateinamen zu erhalten, und indexOf anstelle von lastIndexOf, um zuerst '.' und Erweiterung danach

+2

Also, was würde Ihr Programm die Erweiterung betrachten, wenn ich Ihnen eine Datei 'program.logs.tar.gz' geben würde? –

+0

Zustimmen, dies funktioniert nicht für Dateien mit eingebetteten Versionsnummern. – grkvlt

0

Sie können den Dateinamen Teil des Pfades erhalten, aufgeteilt auf . und nehmen Sie die letzten 0, 1 oder 2 Elemente im Array als die Erweiterung.

Natürlich, wenn .tar.* (gz, bz2, etc.) ist Ihre einzige Rand Fall kann es pragmatisch sein, nur eine Lösung zu erstellen, die Dateinamen für .tar filtert. und verwende das als den Punkt, an dem die Erweiterung extrahiert werden soll (um den .tar-Teil aufzunehmen).

2

Eine Datei kann nur eine Erweiterung haben!

Wenn Sie eine Datei test.tar.gz,

  • .gz ist die Erweiterung und
  • test.tar ist der Basisname haben!

.tar in diesem Fall ist Teil des Basisnamens, nicht der Teil der Erweiterung!

Wenn Sie eine Datei als tar und gz codiert haben möchten, sollten Sie es .tgz nennen. Eine .tar.gz zu verwenden, ist eine schlechte Übung, wenn Sie mit diesen Dateien umgehen müssen, sollten Sie eine Umgehung wie die Datei in test.tgz umbenennen.

+1

Um zu unterscheiden: die "Erweiterung" ist, was auch immer eine Anwendung definiert. Aus Sicht des Betriebssystems gibt es keine "Erweiterung". – Ingo

+0

Ein OS pov, hm ... es ist vielleicht mehr sicher zu sagen von FS pov. –