2012-08-31 23 views
6

Próbuję zaimplementować program do rozpakowania i rozpakowania pliku. Wszystko, co chcę zrobić, to zip plik (fileName.fileExtension) o nazwie jako fileName.zip i po rozpakowaniu zmienić go ponownie na fileName.fileExtension. Czy ktoś może mi powiedzieć, jak to zrobić?Jak zmienić rozszerzenie pliku w czasie wykonywania

+0

sprawdzić Apache API do IO [FilenameUtils] (http://commons.apache.org/io/api-1.4/org/apache/commons/ io/Nazwa plikuUtils.html) –

+0

Zacznę od czytania [File.renameTo] (http://docs.oracle.com/javase/7/docs/api/java/io/File.html#renameTo (java.io .File)) – MadProgrammer

+0

@Nandkumar: Dzięki Myślę, że będzie to przydatne dla mnie. Ale problem wydaje się, że mogę rozpakować plik w dowolnym momencie (może być w innej sesji). Jak zachować poprzednie rozszerzenie? – rahul0789

Odpowiedz

4

Spróbuj z:

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

To jak kiedyś zmieniać nazwy plików lub zmienić jego rozszerzenie.

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

edit: metoda Johna zmienia nazwę pliku (przy zachowaniu rozszerzenia). Aby zmienić rozszerzenie zrobić:

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

powoduje jedynie zmianę ostatniego rozszerzenia do pliku, to znaczy .gz część archive.tar.gz. Dlatego działa dobrze z ukrytymi plikami linux, dla których nazwa zaczyna się od . Jest to całkiem bezpieczne, ponieważ jeśli getParent() zwraca null (tj. W przypadku, gdy rodzic jest rootem systemu), jest "rzutowany" na pusty łańcuch jako cały argument konstruktora pliku jest oceniany jako pierwszy.

Jedynym przypadkiem, w którym otrzymasz zabawne dane wyjściowe, jest przekazanie pliku reprezentującego sam systemowy katalog główny, w którym to przypadku plik null jest dodawany do reszty łańcucha znaków.

+0

Cześć John. To samo podejście obecnie używam. Co chcę zrobić, to mogę oddzielnie korzystać z funkcji zamka błyskawicznego i rozpinania. W takim przypadku nie będę miał rozszerzenia pliku. – rahul0789

+7

indexOf nie działa. Wypróbuj lastIndexOf(). To dlatego, że tylko tekst po ostatnim "." jest rozszerzeniem, a plik może mieć wiele "." postacie. Poza tym przeszukiwanie od końca jest zwykle szybsze w znalezieniu rozszerzenia – brunoais

+0

. Dokonałbym dwóch zmian: a) nazwa newExtension as newExtensionWithDot b) zwrócenie nowego pliku (f.getParent(), nazwa + nowe rozszerzenie); // "/" jest kompatybilny tylko z Uniksem, więc kod może być użyty wszędzie. – BitLauncher

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

Chciałbym sprawdzić, czy plik ma rozszerzenie przed zmianą. Poniższa rozwiązanie działa także z plików bez rozszerzenia lub wieloma rozszerzeniami

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"))); 
} 
Powiązane problemy