Renombrar archivos en java

VipeR_CS

Holaquetal,

A ver, tengo un método que me está dando por culo porque básicamente no me funciona y no sé el motivo. Para poneros en situación, tengo 2 carpetas con X archivos (las 2 carpetas el mismo número de archivos). Lo que intento es renombrar los archivos de una de ellas, con el nombre que le corresponde del archivo "equivalente" de la otra carpeta.

Podría esperarse que se renombraran con el nombre del archivo que le salga de la polla y no coincidan los de la carpeta A y la carpeta B, pero directamente me está fallando el renombrar y me está empezando a tocar los reales. Con código seguro que se ve mejor, este es el asunto:

 public static void renameThumbs() {
        File dirThumbs = new File("C:\\Users\\aKiLeS\\Desktop\\XMLParser\\Thumbs");
        File dirVids = new File("C:\\Users\\aKiLeS\\Desktop\\XMLParser\\Vids");
        File thumbs[] = dirThumbs.listFiles(new ImageFileFilter());
        File vids[] = dirVids.listFiles(new VideoFileFilter());

    if (vids.length == thumbs.length) {
        int i = 0;
        
        for (File fV : vids) {
            File fT = thumbs[i];
            if(!fT.renameTo(fV))
                System.out.println("Rename failed");
            
            i++;
        }
    } else {
        System.out.println("File count does not match in 'Vids' and 'Thumbs'");
    }          
}

Seguramente sea una gitanada, como se puede ver es bastante simple, pero la teoría me dice que debería funcionar. Sin embargo siempre me devuelve false el rename y me muestra el mensajito de fail. Los archivos fT y fV se recuperan correctamente y en el path va la ruta completa de cada uno de los respectivos archivos (aunque me he fijado que va separada por doble backslash \, no sé si debería ser así). A pesar de que todo parece estar correctamente, el rename me dice que peine pa mi.

¿Alguna idea de dónde puede estar el problema? Gracias por adelantado.

MTX_Anubis

si no me equivoco, el renameTo lo que hace es mover un archivo de un sitio a otro. Probablemente te devuelva false porque ya existe ese archivo en la otra carpeta

Edit: Sacado del api:
Many aspects of the behavior of this method are inherently platform-dependent: The rename operation might not be able to move a file from one filesystem to another, it might not be atomic, and it might not succeed if a file with the destination abstract pathname already exists. The return value should always be checked to make sure that the rename operation was successful.

1 respuesta
VipeR_CS

#2 los archivos de ambas carpetas tienen nombres completamente diferentes. De hecho la gracia de todo esto es ponerle los mismos nombres a los de la carpeta A que a los de la B.

1 respuesta
MTX_Anubis

#3 No.

Al moverlo, le cambias el nombre al archivo de la carpeta donde quieres moverlo, es decir, en este caso le estás dando path absoluto de fV al archivo. El path absoluto también incluye su nombre por lo tanto el archivo ya existe. No sé si me explico. Haces algo así:

Carpeta Thumbs:

  • Video1
    Caperta Vids:
    • Video2

Lo que haces es cambiar el nombre de Video2 a Video1 y además, intentar moverlo a la carpeta Thumbs (ya que el nombre que le estás poniendo es C:\blablabla\Thumbs\Video1), donde ya existe ese Video1.

1 respuesta
VipeR_CS

#4 Cierto, tienes razón. Pero entonces lo que yo quiero no va a ser posible hacerlo con renameTo, salvo que haga otro array de archivos "virtuales" con las rutas cambiadas por mí con la carpeta correcta. ¿Alguna sugerencia mejor?

MTX_Anubis

#4 algo así:

fT.renameTo(new File(dirThumbs.getPath(),fV.getName())

Ahora mismo no sé si el getPath() devuelve el todo el path de un archivo incluyendo el nombre o solo hasta su directorio por eso utilizo el del directorio.

O pones el String del directorio y listo.

1 respuesta
TaiCHoKe

Lo de #6 deberia valerte siempre que dirThumbs sea la carpeta en la que tengas los archivos.

Sino prueba con

fT.renameTo(new File(dirThumbs, fV.getName()))
VipeR_CS

Pues sí, ha funcionado correctamente apañándolo un poco (getName devuelve también la extensión y eso era algo que no me interesaba). Gracias ^^

1 respuesta
TaiCHoKe

#8 Y sin ponerle la extension no se te corrompe el archivo?

1 respuesta
VipeR_CS

#9 Eso ya lo he puesto yo. getName devolvía el nombre con extensión, pero no era la extensión que me interesaba así que tuve que quitársela y concatenarle la que yo quería. Al final ha quedado así:

public static void renameThumbs() {
        File dirThumbs = new File("C:\\Users\\aKiLeS\\Desktop\\XMLParser\\Thumbs");
        File dirVids = new File("C:\\Users\\aKiLeS\\Desktop\\XMLParser\\Vids");
        File thumbs[] = dirThumbs.listFiles(new ImageFileFilter());
        File vids[] = dirVids.listFiles(new VideoFileFilter());
        
if (vids.length == thumbs.length) { int i = 0; int index = 0; for (File fV : vids) { File fT = thumbs[i]; index = fV.getName().lastIndexOf("."); if(!fT.renameTo(new File(dirThumbs.getPath(),fV.getName().substring(0, index)+".jpg"))) System.out.println("Rename failed"); i++; } } else { System.out.println("File count does not match in 'Vids' and 'Thumbs'"); } }

Usuarios habituales

  • VipeR_CS
  • TaiCHoKe
  • MTX_Anubis