2012-04-01 18 views
6

Estoy tratando de agregar una extensión al nombre del archivo seleccionado por JFileChooser aunque no puedo hacerlo funcionar.El archivo renameTo no funciona

Este es el código:

final JFileChooser fc = new JFileChooser(); 
     fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
     int returnVal = fc.showSaveDialog(null); 
     if (returnVal == JFileChooser.APPROVE_OPTION) { 
      File f = fc.getSelectedFile(); 
      String name =f.getAbsoluteFile()+".txt"; 
      f.renameTo(new File(name)); 
      FileWriter fstream; 
      try { 
       fstream = new FileWriter(f); 
       BufferedWriter out = new BufferedWriter(fstream); 
       out.write("test one"); 
       out.close(); 
      } catch (IOException ex) { 
       Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex); 
      } 
     } 

No puedo entender por qué esto no funciona. También intenté usar getPath() y getCanonicalPath(), pero el resultado es el mismo. El archivo se crea en el directorio seleccionado, aunque sin una extensión ".txt".

+1

has comprobado el resultado de 'renameTo '? Esto es de la documentación de Java" Si este método puede mover un archivo de un sistema de archivos a otro depende de la plataforma. El valor de retorno siempre debe verificarse para asegurarse de que la operación de cambio de nombre fue exitosa. " – twain249

+0

Sí, siempre es return false. La única vez que funcionó fue cuando establecí el nuevo nombre de archivo manualmente pero sin incluir la ruta: "test.txt". Eso creó un txt que contenía "prueba uno" pero no en el directorio seleccionado – Giannis

+0

¿Estás seguro de que el objetivo archivo no existe ya? –

Respuesta

2

Me parece que lo único que quiere hacer es cambiar el nombre del archivo elegido, en lugar de cambiar el nombre de un archivo en el sistema de archivos. En ese caso, no use File.renameTo. Usted acaba de cambiar el File. Algo parecido a lo siguiente debería funcionar:

 File f = fc.getSelectedFile(); 
     String name = f.getAbsoluteFile()+".txt"; 
     f = new File(name); 

File.renameTo intentos de cambiar el nombre de un archivo en el sistema de archivos. Por ejemplo:

File oldFile = new File("test1.txt"); 
File newFile = new File("test2.txt"); 
boolean success = oldFile.renameTo(newFile); // renames test1.txt to test2.txt 

Después de estas tres líneas, success habrá true si el archivo test1.txt podría ser renombrado a test2.txt, y false si el cambio de nombre no tuvo éxito (por ejemplo test1.txt no existe, está abierto en otro proceso, se denegó el permiso, etc.)

Me arriesgaré a suponer que el cambio de nombre que está intentando está fallando porque está intentando cambiar el nombre de un directorio (está usando un JFileChooser con la opción DIRECTORIES_ONLY). Si tiene programas que usan archivos dentro de este directorio, o un Símbolo del sistema abierto en su interior, se opondrán a que se cambie el nombre de este directorio.

+0

Sí, tiene razón. Terminé creando un nuevo archivo usando el nombre (directorio) del Selector. Solo pensé que el renameTo era una operación que podría usarse en este caso. – Giannis

+0

En mi caso, el BufferedReader estaba abierto. Por este motivo, no se puede cambiar el nombre del archivo. – ELD

0

Está escribiendo en el archivo equivocado. Cuando llamas a renameTo, el archivo actual no cambia su ruta. Prueba esto:

final JFileChooser fc = new JFileChooser(); 
    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 
    int returnVal = fc.showSaveDialog(null); 
    if (returnVal == JFileChooser.APPROVE_OPTION) { 
     File f = fc.getSelectedFile(); 
     String name =f.getAbsoluteFile()+".txt"; 
     File f2 = new File(name); 
     f.renameTo(f2); 
     FileWriter fstream; 
     try { 
      fstream = new FileWriter(f2); 
      BufferedWriter out = new BufferedWriter(fstream); 
      out.write("test one"); 
      out.close(); 
     } catch (IOException ex) { 
      Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 
+0

Bueno, esto realmente no hace ningún uso del método renameTo. Aunque funciona – Giannis

1

También puede utilizar la utilidad de las bibliotecas Files.move Google Guava cambiar el nombre de un archivo. Es más fácil que escribir tu propio método.

A partir de los documentos:

Mueve el archivo de una ruta a otra. Este método puede cambiar el nombre de un archivo o moverlo a un directorio diferente, como el comando Unix mv.

0

Si desea cambiar el nombre del archivo entonces no hay necesidad de cerrar todos los objetos (como FileReader, FileWriter, esquí alpino, FOSmeans cierran el objeto archivo de lectura y luego cambiarle el nombre

+0

Si bien esto podría ser un consejo valioso para resolver el problema, una respuesta realmente necesita un poco más de detalle que esto. Por favor, [editar] para proporcionar un código de ejemplo para mostrar lo que quiere decir. Alternativamente, considere escribir esto como un comentario en su lugar. –