Renommer un fichier à l'aide de Java


174

Peut - on renommer un exemple de fichier test.txtà test1.txt?

S'il test1.txtexiste, va-t-il renommer?

Comment puis-je le renommer en fichier test1.txt déjà existant afin que le nouveau contenu de test.txt y soit ajouté pour une utilisation ultérieure?


6
Votre dernier paragraphe ne décrit pas du tout une opération de changement de nom. Il décrit une opération d'ajout.
Marquis of Lorne

Réponses:


173

Copié de http://exampledepot.8waytrips.com/egs/java.io/RenameFile.html

// File (or directory) with old name
File file = new File("oldname");

// File (or directory) with new name
File file2 = new File("newname");

if (file2.exists())
   throw new java.io.IOException("file exists");

// Rename file (or directory)
boolean success = file.renameTo(file2);

if (!success) {
   // File was not successfully renamed
}

Pour ajouter au nouveau fichier:

java.io.FileWriter out= new java.io.FileWriter(file2, true /*append=yes*/);

24
Ce code ne fonctionnera pas dans tous les cas ou plates-formes. Le changement de nom en méthode n'est pas fiable: stackoverflow.com/questions/1000183/…
Stephane Grenier

Seule la Pathmanière fonctionne pour moi, renameToretourne toujours faux. Vérifiez la réponse de kr37 ou cette réponse
andras

107

En bref:

Files.move(source, source.resolveSibling("newname"));

Plus de détails:

import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

Ce qui suit est copié directement à partir de http://docs.oracle.com/javase/7/docs/api/index.html :

Supposons que nous voulions renommer un fichier en "nouveau nom", en gardant le fichier dans le même répertoire:

Path source = Paths.get("path/here");
Files.move(source, source.resolveSibling("newname"));

Sinon, supposons que nous souhaitons déplacer un fichier vers un nouveau répertoire, en conservant le même nom de fichier et en remplaçant tout fichier existant de ce nom dans le répertoire:

Path source = Paths.get("from/path");
Path newdir = Paths.get("to/path");
Files.move(source, newdir.resolve(source.getFileName()), REPLACE_EXISTING);

1
Path est une interface dont les seules implémentations sont WindowsPath, ZipPath et AbstractPath. Est-ce que ce sera un problème pour les implémentations multi-plateformes?
Caelum

1
Salut @ user2104648, ici ( tutorials.jenkov.com/java-nio/path.html ) est un exemple sur la façon dont vous pourriez gérer les fichiers dans un environnement Linux. Fondamentalement, vous devez utiliser java.nio.file.Paths.get (somePath) au lieu d'utiliser l'une des implémentations que vous avez mentionnées
maxivis

2
Qu'est-ce que Path source = ...?
Koray Tugay

@ kr37 réponse impeccable!
gaurav le

30

Vous souhaitez utiliser la méthode renameTo sur un objet File .

Tout d'abord, créez un objet File pour représenter la destination. Vérifiez si ce fichier existe. S'il n'existe pas, créez un nouvel objet File pour le fichier à déplacer. appelez la méthode renameTo sur le fichier à déplacer et vérifiez la valeur renvoyée par renameTo pour voir si l'appel a réussi.

Si vous souhaitez ajouter le contenu d'un fichier à un autre, plusieurs graveurs sont disponibles. Basé sur l'extension, cela ressemble à du texte brut, donc je regarderais FileWriter .


9
Aucune idée, mais c'est exactement la même chose que Pierre a postée, sans le code source ...
Thomas Owens

28

Pour Java 1.6 et inférieur, je pense que l'API la plus sûre et la plus propre pour cela est Files.move de Guava .

Exemple:

File newFile = new File(oldFile.getParent(), "new-file-name.txt");
Files.move(oldFile.toPath(), newFile.toPath());

La première ligne s'assure que l'emplacement du nouveau fichier est le même répertoire, c'est-à-dire le répertoire parent de l'ancien fichier.

EDIT: J'ai écrit ceci avant de commencer à utiliser Java 7, qui a introduit une approche très similaire. Donc, si vous utilisez Java 7+, vous devriez voir et voter pour la réponse de kr37.


18

Renommer le fichier en le déplaçant vers un nouveau nom. (FileUtils provient de la librairie Apache Commons IO)

  String newFilePath = oldFile.getAbsolutePath().replace(oldFile.getName(), "") + newName;
  File newFile = new File(newFilePath);

  try {
    FileUtils.moveFile(oldFile, newFile);
  } catch (IOException e) {
    e.printStackTrace();
  }

13

C'est un moyen simple de renommer un fichier:

        File oldfile =new File("test.txt");
        File newfile =new File("test1.txt");

        if(oldfile.renameTo(newfile)){
            System.out.println("File renamed");
        }else{
            System.out.println("Sorry! the file can't be renamed");
        }

5
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import static java.nio.file.StandardCopyOption.*;

Path yourFile = Paths.get("path_to_your_file\text.txt");

Files.move(yourFile, yourFile.resolveSibling("text1.txt"));

Pour remplacer un fichier existant par le nom "text1.txt":

Files.move(yourFile, yourFile.resolveSibling("text1.txt"),REPLACE_EXISTING);

5

Essaye ça

File file=new File("Your File");
boolean renameResult = file.renameTo(new File("New Name"));
// todo: check renameResult

Remarque: Nous devons toujours vérifier la valeur de retour renameTo pour nous assurer que le changement de nom du fichier réussit car il dépend de la plate-forme (système d'exploitation différent, système de fichiers différent) et ne lève pas d'exception IO si le changement de nom échoue.


En quoi est-ce différent de la réponse acceptée donnée par Pierre 9 ans plus tôt?
Fourrage le

4

Oui, vous pouvez utiliser File.renameTo (). Mais rappelez-vous d'avoir le chemin correct en le renommant en un nouveau fichier.

import java.util.Arrays;
import java.util.List;

public class FileRenameUtility {
public static void main(String[] a) {
    System.out.println("FileRenameUtility");
    FileRenameUtility renameUtility = new FileRenameUtility();
    renameUtility.fileRename("c:/Temp");
}

private void fileRename(String folder){
    File file = new File(folder);
    System.out.println("Reading this "+file.toString());
    if(file.isDirectory()){
        File[] files = file.listFiles();
        List<File> filelist = Arrays.asList(files);
        filelist.forEach(f->{
           if(!f.isDirectory() && f.getName().startsWith("Old")){
               System.out.println(f.getAbsolutePath());
               String newName = f.getAbsolutePath().replace("Old","New");
               boolean isRenamed = f.renameTo(new File(newName));
               if(isRenamed)
                   System.out.println(String.format("Renamed this file %s to  %s",f.getName(),newName));
               else
                   System.out.println(String.format("%s file is not renamed to %s",f.getName(),newName));
           }
        });

    }
}

}



2

Autant que je sache, renommer un fichier n'ajoutera pas son contenu à celui d'un fichier existant avec le nom cible.

À propos du changement de nom d'un fichier en Java, consultez la documentation de la renameTo()méthode dans la classe File.


1
Files.move(file.toPath(), fileNew.toPath()); 

fonctionne, mais seulement lorsque vous fermez (ou fermez automatiquement) TOUTES les ressources utilisées ( InputStream, FileOutputStreametc.) Je pense que la même situation avec file.renameToou FileUtils.moveFile.


1

Voici mon code pour renommer plusieurs fichiers dans un dossier avec succès:

public static void renameAllFilesInFolder(String folderPath, String newName, String extension) {
    if(newName == null || newName.equals("")) {
        System.out.println("New name cannot be null or empty");
        return;
    }
    if(extension == null || extension.equals("")) {
        System.out.println("Extension cannot be null or empty");
        return;
    }

    File dir = new File(folderPath);

    int i = 1;
    if (dir.isDirectory()) { // make sure it's a directory
        for (final File f : dir.listFiles()) {
            try {
                File newfile = new File(folderPath + "\\" + newName + "_" + i + "." + extension);

                if(f.renameTo(newfile)){
                    System.out.println("Rename succesful: " + newName + "_" + i + "." + extension);
                } else {
                    System.out.println("Rename failed");
                }
                i++;
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

}

et exécutez-le pour un exemple:

renameAllFilesInFolder("E:\\Downloads\\Foldername", "my_avatar", "gif");

-2

Le code en cours d'exécution est ici.

private static void renameFile(File fileName) {

    FileOutputStream fileOutputStream =null;

    BufferedReader br = null;
    FileReader fr = null;

    String newFileName = "yourNewFileName"

    try {
        fileOutputStream = new FileOutputStream(newFileName);

        fr = new FileReader(fileName);
        br = new BufferedReader(fr);

        String sCurrentLine;

        while ((sCurrentLine = br.readLine()) != null) {
            fileOutputStream.write(("\n"+sCurrentLine).getBytes());
        }

        fileOutputStream.flush();
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            fileOutputStream.close();
            if (br != null)
                br.close();

            if (fr != null)
                fr.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }
}

2
Habituellement, il est préférable d'expliquer une solution au lieu de simplement publier quelques lignes de code anonyme. Vous pouvez lire Comment écrire une bonne réponse , et aussi expliquer les réponses entièrement basées sur le code
Anh Pham

Copier et renommer sont généralement des opérations différentes, donc je pense qu'il devrait être clairement indiqué qu'il s'agit d'une copie. Ce qui est également inutile car il copie des caractères et non des octets.
Joel Klinghed
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.