2012-08-31 20 views
6

Ich versuche, Programm zu implementieren, um eine Datei zip und entpacken. Alles, was ich tun möchte, ist eine Datei (fileName.fileExtension) mit Namen wie fileName.zip zippen und beim Entpacken wieder zu fileName.fileExtension ändern. Kann mir jemand einen Weg sagen, dies zu tun?So ändern Sie die Dateierweiterung zur Laufzeit

+0

Apache API prüfen io [FilenameUtils] (http://commons.apache.org/io/api-1.4/org/apache/commons/ io/DateinameUtils.html) –

+0

Ich würde mit dem Lesen beginnen [File.renameTo] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#renameTo (java.io .File)) – MadProgrammer

+0

@Nandkumar: Danke, ich denke, es wird etwas nützlich für mich sein. Aber das Problem scheint, dass ich die Datei jederzeit später entzippen kann (möglicherweise in einer anderen Sitzung). Wie kann ich die vorherige Erweiterung beibehalten? – rahul0789

Antwort

4

Versuchen mit:

File file = new File("fileName.zip"); // handler to your ZIP file 
File file2 = new File("fileName.fileExtension"); // destination dir of your file 
boolean success = file.renameTo(file2); 
if (success) { 
    // File has been renamed 
} 
4

Dies ist, wie ich verwendet, um Dateien umzubenennen oder dessen Erweiterung zu ändern.

public static void modify(File file) 
    { 
     int index = file.getName().indexOf("."); 
     //print filename 
     //System.out.println(file.getName().substring(0, index)); 
     //print extension 
     //System.out.println(file.getName().substring(index)); 
     String ext = file.getName().substring(index); 
     //use file.renameTo() to rename the file 
     file.renameTo(new File("Newname"+ext)); 
    } 

bearbeiten: John Methode benennt die Datei (die Erweiterung zu halten). Um die Erweiterung zu ändern tun:

public static File changeExtension(File f, String newExtension) { 
    int i = f.getName().lastIndexOf('.'); 
    String name = f.getName().substring(0,i); 
    return new File(f.getParent() + "/" + name + newExtension); 
} 

dies nur Änderungen die letzte Erweiterung auf einen Dateinamen, das heißt den .gz Teil archive.tar.gz. Daher funktioniert es gut mit versteckten linux Dateien, für die der Name mit . beginnt. Das ist ziemlich sicher, denn wenn getParent()null zurückgibt (dh im Falle, dass das Elternsystem der Systemstamm ist), wird es in einen leeren String umgewandelt Das ganze Argument für den Dateikonstruktor wird zuerst ausgewertet.

Der einzige Fall, in dem Sie eine lustige Ausgabe bekommen, ist, wenn Sie eine Datei übergeben, die den Systemstamm selbst darstellt. In diesem Fall wird null dem Rest der Pfadzeichenfolge vorangestellt.

+0

Hallo John. Derselbe Ansatz, den ich derzeit verwende. Was ich tun möchte, ist, dass ich den Reißverschluss und die Entzipperfunktion separat benutzen kann. In diesem Fall wird die Datei nicht erweitert. – rahul0789

+7

indexOf funktioniert nicht. Versuchen Sie stattdessen lastIndexOf(). Das ist, weil nur der Text nach dem letzten "." ist die Erweiterung und eine Datei kann mehrere "." Figuren. Außerdem ist die Suche nach dem Ende normalerweise schneller, um die Erweiterung zu finden. – brunoais

+0

Ich würde zwei Änderungen vornehmen: a) Name newExtension als newExtensionWithDot b) neue Datei zurückgeben (f.getParent(), name + newExtension); // "/" ist nur Unix-kompatibel, daher kann der Code überall verwendet werden. – BitLauncher

0
FilenameUtils.getFullPathNoEndSeparator(doc.getDocLoc()) + "/" + 
    FilenameUtils.getBaseName(doc.getDocLoc()) + ".xml" 
0

Ich würde prüfen, ob die Datei eine Erweiterung vor dem Ändern hat. Die Lösung unten funktioniert auch mit Dateien ohne Erweiterung oder mehrere Erweiterungen

public File changeExtension(File file, String extension) { 
    String filename = file.getName(); 

    if (filename.contains(".")) { 
     filename = filename.substring(0, filename.lastIndexOf('.')); 
    } 
    filename += "." + extension; 

    file.renameTo(new File(file.getParentFile(), filename)); 
    return file; 
} 

@Test 
public void test() { 
    assertThat(changeExtension(new File("C:/a/aaa.bbb.ccc"), "txt"), 
          is(new File("C:/a/aaa.bbb.txt"))); 

    assertThat(changeExtension(new File("C:/a/test"), "txt"), 
          is(new File("C:/a/test.txt"))); 
} 
Verwandte Themen