2013-01-18 7 views
7

Sto cercando un'operazione per spostare e sovrascrivere un file. So che c'è un nuovo metodo in Java7, ma speravo di aggirare Java7. Conosco anche i metodi in FileUtils e Guava, ma FileUtils non sovrascriverà e Guava non lo documenterà.Esiste un'operazione per spostare e sovrascrivere i file?

Anche io sono consapevole, potrei scrivere il mio metodo, ho iniziato, ma ho visto alcuni problemi qua e là, quindi speravo in qualcosa già fatto.

Avete qualche suggerimento?

+0

Hai mai provato con Guava? – nhahtdh

+0

@nhahtdh No, non ho provato il Guava. Ma io dichiaro di implementare Unix mv, e il mv non sovrascriverà senza prompt. http://unixhelp.ed.ac.uk/CGI/man-cgi?mv – Robin

risposta

5

Ho finito con la scrittura il mio metodo, per tutti interessati a una possibile soluzione, ho usato le ApacheCommons fileutils, anche questo è probabilmente non è perfetto, ma funziona abbastanza bene per me:

/** 
* 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

Io uso il seguente metodo:

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

Grazie, beh questa è stata la mia prima implementazione, ma i miei file sono abbastanza grandi. Quindi, se il programma si interromperà dopo aver eliminato il file first, tutti i dati verranno persi o diffusi da qualche parte. Modifica: E questo problema è apparso, è per questo che sto chiedendo. Quindi ho bisogno di aggiustarlo. – Robin

+0

Mi rendo conto che questo è un vecchio post, ma attualmente sto usando questo metodo e non sovrascrive come richiesto dall'autore, che è anche il motivo per cui lo sto sostituendo – Mike

1

Nel caso in cui si procederà a scrivere la propria utilità, si consiglia di dare un'occhiata a implementation del compito copy in Ant dato che supporta la sovrascrittura.

+0

Grazie per il link, ma speravo in una soluzione esistente . – Robin

1

Utilizzo di 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

un puro Java NIO mossa soluzione con il metodo prioritario potrebbe essere implementato con un target pre-delete come mostrato

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 per FileUtils.copyFileToDirectory dice "Se il file di destinazione esiste, questo metodo lo sovrascriverà". Dopo la copia, è possibile verificare prima dell'eliminazione.

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

soluzione più breve, che ha funzionato per me:

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

GuavaFiles.write:

Sovrascrive un file con i contenuti di un array di byte

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

Files.copy:

Attenzione: se a rappresenta un file esistente, il file sarà sovrascritto con il contenuto di da. Se si desidera e si riferisce allo stesso file , il contenuto di tale file verrà eliminato.

Files.move utilizza copyunder the hood. Quindi è sicuro assumere che esso sovrascriva troppo.

Problemi correlati