2012-04-01 18 views
6

Sto tentando di aggiungere un'estensione al nome del file selezionato da un JFileChooser anche se non riesco a farlo funzionare.Rinomina filePer non funziona

Questo è il codice:

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); 
      } 
     } 

io non riesco a capire il motivo per cui questo non funziona. Ho anche provato a usare getPath() e getCanonicalPath() ma il risultato è lo stesso. Il file viene creato nella directory selezionata, sebbene senza un'estensione ".txt".

+1

hai controllato il risultato da 'renameTo '? Dalla documentazione di Java?" Se questo metodo può spostare un file da un file system a un altro dipende dalla piattaforma. Il valore di ritorno dovrebbe sempre essere controllato per assicurarsi che l'operazione di rinomina abbia avuto successo. " – twain249

+0

Sì, è sempre restituendo false. L'unica volta che ha funzionato è quando ho impostato manualmente il nuovo nome del file ma senza includere il percorso: "test.txt". Questo ha creato un txt contenente "test uno" ma non nella directory selezionata – Giannis

+0

Sei sicuro che il target il file non esiste già? –

risposta

2

Mi sembra che tutto quello che vogliamo fare è di cambiare il nome del file prescelto, al contrario di rinominare un file sul filesystem. In tal caso, non utilizzare File.renameTo. Basta cambiare il File. Qualcosa come il seguente dovrebbe funzionare:

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

File.renameTo tentativi di rinominare un file sul filesystem. Per esempio:

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

Dopo queste tre linee, success sarà true se il file test1.txt potrebbe essere rinominato test2.txt, e false se la ridenominazione non ha avuto successo (ad esempio test1.txt non esiste, è aperto in un altro processo, il permesso è stato negato, ecc)

io ti azzardare un'ipotesi che la ridenominazione si sta tentando sta fallendo perché si sta tentando di rinominare una directory (si utilizza un JFileChooser con l'opzione DIRECTORIES_ONLY). Se hai programmi che usano file all'interno di questa directory, o un Prompt dei comandi aperto al suo interno, obietteranno a questa directory di essere rinominata.

+0

Sì, hai ragione, ho finito con la creazione di un nuovo file usando il nome (directory) da Scelta Risorse. Ho solo pensato che il rinominare fosse un'operazione che potrebbe essere utilizzata in questo caso. – Giannis

+0

Nel mio caso, BufferedReader era aperto. Per questo motivo il file non può essere rinominato. – ELD

0

Si sta scrivendo nel file sbagliato. Quando chiami RenameTo, il file corrente non cambia il suo percorso. Prova questo:

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

Bene, questo non fa alcun uso del metodo renameTo. Anche se funziona. – Giannis

1

Si potrebbe anche usare l'utilità Files.move dalle librerie Google Guava per rinominare un file. È più facile che scrivere il tuo metodo.

Dalla documentazione:

sposta il file da un percorso a un altro. Questo metodo può rinominare un file o spostarlo in una directory diversa, come il comando Unix mv.

0

Se si desidera rinominare il file allora non è necessario per chiudere tutti gli oggetti (come FileReader, FileWriter, sci alpino, FOSmeans chiudere il l'oggetto file di lettura e quindi rinominarlo

+0

Anche se questo potrebbe essere un suggerimento prezioso per risolvere il problema, una risposta ha davvero bisogno di un po 'più di dettagli. Si prega di [modifica] per fornire codice di esempio per mostrare cosa intendi. In alternativa, considera di scrivere questo come un commento. –