2013-01-18 14 views
7

Szukam operacji, aby przenieść i zastąpić plik. Wiem, że istnieje nowa metoda w Java7, ale miałem nadzieję, że obejdziemy Java7. Też wiem o Metody w FileUtils i Guava, ale FileUtils nie zastąpi i Guawa nie dokumentuje tego.Czy istnieje operacja przenoszenia i zastępowania plików?

Jestem również świadomy, że mógłbym napisać własną Metodę, dobrze, zacząłem, ale widziałem pewne problemy tu i tam, więc miałem nadzieję na coś już zrobionego.

Czy masz jakieś sugestie?

+0

Czy próbowałeś już z Guava? – nhahtdh

+0

@nhahtdh Nie, nie próbowałem guawy. Ale oświadczam, że implementuję Unix mv, a mv nie nadpisze go bez pytania. http://unixhelp.ed.ac.uk/CGI/man-cgi?mv – Robin

Odpowiedz

5

Jestem wykończona pisząc własną metodę, dla wszystkich zainteresowanych w ewentualnym rozwiązaniu użyłem Apache Commons fileutils, także to chyba nie jest doskonały, ale działa wystarczająco dobrze dla mnie:

/** 
* Will move the source File to the destination File. 
* The Method will backup the dest File, copy source to 
* dest, and then will delete the source and the backup. 
* 
* @param source 
*   File to be moved 
* @param dest 
*   File to be overwritten (does not matter if 
*   non existent) 
* @throws IOException 
*/ 
public static void moveAndOverwrite(File source, File dest) throws IOException { 
    // Backup the src 
    File backup = CSVUtils.getNonExistingTempFile(dest); 
    FileUtils.copyFile(dest, backup); 
    FileUtils.copyFile(source, dest); 
    if (!source.delete()) { 
     throw new IOException("Failed to delete " + source.getName()); 
    } 
    if (!backup.delete()) { 
     throw new IOException("Failed to delete " + backup.getName()); 
    } 
} 

/** 
* Recursive Method to generate a FileName in the same 
* Folder as the {@code inputFile}, that is not existing 
* and ends with {@code _temp}. 
* 
* @param inputFile 
*   The FileBase to generate a Tempfile 
* @return A non existing File 
*/ 
public static File getNonExistingTempFile(File inputFile) { 
    File tempFile = new File(inputFile.getParentFile(), inputFile.getName() + "_temp"); 
    if (tempFile.exists()) { 
     return CSVUtils.getNonExistingTempFile(tempFile); 
    } else { 
     return tempFile; 
    } 
} 
11

używam następujące metody:

public static void rename(String oldFileName, String newFileName) { 
    new File(newFileName).delete(); 
    File oldFile = new File(oldFileName); 
    oldFile.renameTo(new File(newFileName)); 
} 
+2

Dziękuję, to była moja pierwsza implementacja, ale moje pliki są dość duże. Jeśli więc program zostanie przerwany po usunięciu pierwszego pliku, wszystkie dane zostaną utracone lub rozprzestrzenione gdzieś. Edycja: I pojawił się ten problem, dlatego proszę. Muszę to naprawić. – Robin

+0

Zdaję sobie sprawę, że jest to stary post, ale obecnie używam tej metody i nie jest ona zastępowana zgodnie z żądaniem autora, dlatego też ją zastępuję. – Mike

1

W przypadku będziesz kontynuować pisanie własnego narzędzia, może warto spojrzeć na implementation zadania w Ant copy ponieważ wspiera nadpisywanie.

+0

Dziękuję za link, ale miałem nadzieję na istniejące rozwiązania . – Robin

1

Korzystanie z Apache Commons fileutils:

try {   
     FileUtils.moveFile(source, dest); 
     print("------------------------------"); 
     print(name 
       + " moved to " 
       + PropertiesUtil 
         .getProperty(PropertiesUtil.COMPLETED_PATH)); 

    } catch (FileExistsException fe){ 

     if(dest.delete()){ 
      try { 
       FileUtils.moveFile(source, dest); 
      } catch (IOException e) { 
       logger.error(e); 
      } 
      print("------------------------------"); 
      print(name 
        + " moved to " 
        + PropertiesUtil 
          .getProperty(PropertiesUtil.COMPLETED_PATH)); 
     } 
    } catch (Exception e) { 

     logger.error(e); 
    } 
0

czysty nio ruch rozwiązanie Java metodą nadrzędnym mogą być realizowane z pre-delete cel jak pokazano

public void move(File sourceFile, String targetFileName) { 
    Path sourcePath = sourceFile.toPath(); 
    Path targetPath = Paths.get(targetFileName); 
    File file = targetFile.toFile(); 
    if(file.isFile()){ 
     Files.delete(destino); 
    } 
    Files.move(origen, destino); 
} 
5

Apache FileUtils JavaDoc dla FileUtils.copyFileToDirectory mówi: "Jeśli plik docelowy istnieje, to ta metoda go zastąpi." Po skopiowaniu możesz zweryfikować przed usunięciem.

public boolean moveFile(File origfile, File destfile) 
{ 
    boolean fileMoved = false; 
    try{ 
    FileUtils.copyFileToDirectory(origfile,new File(destfile.getParent()),true); 
    File newfile = new File(destfile.getParent() + File.separator + origfile.getName()); 
    if(newfile.exists() && FileUtils.contentEqualsIgnoreCaseEOL(origfile,newfile,"UTF-8")) 
    { 
     origfile.delete(); 
     fileMoved = true; 
    } 
    else 
    { 
     System.out.println("File fail to move successfully!"); 
    } 
    }catch(Exception e){System.out.println(e);} 
    return fileMoved; 
} 
2

najkrótsze rozwiązanie pracował dla mnie:

File destFile = new File(destDir, file.getName()); 
if(destFile.exists()) { 
    destFile.delete(); 
} 
FileUtils.moveFileToDirectory(file, destDir, true); 
0

GuavaFiles.write:

nadpisuje plik z treścią tablicy bajtowej

Files.write(bytes, new File(path)); 

Files.copy:

Uwaga: Jeśli do istniejącego pliku oznacza, że ​​plik będzie nadpisane zawartości z. Jeśli do i od odnoszą się do tego samego pliku, zawartość tego pliku zostanie usunięta.

Files.move używa copyunder the hood. Więc można bezpiecznie założyć, że to nadpisuje.

Powiązane problemy