Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    I motivi per cui File.renameTo() non funziona

    Ciao a tutti.

    Il mio programma dovrebbe fare delle operazioni su un file (se è un file firmato, prima estrarne il contenuto e poi leggerlo, se è un xml, leggerlo semplicemente) e poi spostare il file in un'altra cartella.

    Quindi prima controllo il tipo di file, se necessario risolvo la firma, e poi lo leggo, memorizzandomi alcune informazioni.

    Poi lancio il comando f.renameTo( percorso + "\\" + f.getName() );

    In alcuni casi il comando mi viene fatto correttamente, in altri non funziona. Non capita quasi mai sugli stessi file.

    Il file mi pare di chiuderlo correttamente (chiamo il close per il BufferReader, InputStreamReader e FileInputStream nell'ordine) prima di ritornare il valore al programma precedente.

    Quali possono essere i motivi per cui non riesco a fare il Rename?

    (non posso postare il codice perché si tratta di 3 o 4 classi che si chiamano una con l'altra)

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: I motivi per cui File.renameTo() non funziona

    Originariamente inviato da Reiuky
    Quali possono essere i motivi per cui non riesco a fare il Rename?
    Innanzitutto la documentazione di renameTo() spiega chiaramente che molti aspetti della rinominazione sono fortemente dipendenti dal sistema. Quindi a seconda del sistema, potrebbe non essere in grado di spostare il file tra file-system differenti o potrebbe fallire se il file di destinazione esiste già. Giusto per fare due esempi che cita anche la documentazione.

    A parte questo, renameTo() riceve un java.io.File ... nella tua riga che hai riportato sopra concateni delle stringhe e così già non quadra molto.

    E comunque senza sapere quali sono i due File sorgente e destinazione (cioè quali sono i loro path) è un po' difficile dire cosa non va. Potrebbe essere il nuovo path che generi che non va.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Re: Re: I motivi per cui File.renameTo() non funziona

    Originariamente inviato da andbin
    Innanzitutto la documentazione di renameTo() spiega chiaramente che molti aspetti della rinominazione sono fortemente dipendenti dal sistema. Quindi a seconda del sistema, potrebbe non essere in grado di spostare il file tra file-system differenti o potrebbe fallire se il file di destinazione esiste già. Giusto per fare due esempi che cita anche la documentazione.
    In effetti avevo pensato a questa evenienza, ma la cartella di destinazione è vuota (o, meglio, la svuoto io prima di fare le prove... In un secondo momento devo mettere un controllo, ma adesso mi interessa che funzioni)

    A parte questo, renameTo() riceve un java.io.File ... nella tua riga che hai riportato sopra concateni delle stringhe e così già non quadra molto.
    Ho sbagliato a scrivere.
    L'istruzione incriminata è
    codice:
    String nameFile = files[ selectedIndices[count] ].getName();
    [...]
    files[ selectedIndices[count] ].renameTo( new File( directoryOutput + "\\" + nameFile ))
    E comunque senza sapere quali sono i due File sorgente e destinazione (cioè quali sono i loro path) è un po' difficile dire cosa non va. Potrebbe essere il nuovo path che generi che non va.
    Il nuovo path è corretto (cioè... alcuni file mi vengono spostati correttamente, quindi non credo sia li il problema)

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: I motivi per cui File.renameTo() non funziona

    Originariamente inviato da Reiuky
    In effetti avevo pensato a questa evenienza, ma la cartella di destinazione è vuota (o, meglio, la svuoto io prima di fare le prove... In un secondo momento devo mettere un controllo, ma adesso mi interessa che funzioni)
    Giusto per la cronaca, su Windows (testato sul 2000) il renameTo() è in grado di spostare il file tra file-system differenti ma fallisce se la destinazione esiste già. Su altri S.O. non so e non ho mai provato.

    Originariamente inviato da Reiuky
    codice:
    String nameFile = files[ selectedIndices[count] ].getName();
    [...]
    files[ selectedIndices[count] ].renameTo( new File( directoryOutput + "\\" + nameFile ))
    Ok, comunque per essere pignoli, fai prima ad usare il costruttore di File che riceve parent e child, ovvero lascia a lui il compito di comporre il path.
    Che tra l'altro è ovviamente anche più portabile.

    Originariamente inviato da Reiuky
    Il nuovo path è corretto (cioè... alcuni file mi vengono spostati correttamente, quindi non credo sia li il problema)
    Di più però non saprei cosa dire, non avendo tutta la situazione sott'occhio.

    directoryOutput che cosa contiene e da dove ti arriva?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371

    Re: Re: Re: Re: I motivi per cui File.renameTo() non funziona

    Originariamente inviato da andbin
    Giusto per la cronaca, su Windows (testato sul 2000) il renameTo() è in grado di spostare il file tra file-system differenti ma fallisce se la destinazione esiste già. Su altri S.O. non so e non ho mai provato.
    Confermo. Devo metterci un controllo per dire all'utente che il file in questione è già stato elaborato e quindi non elaborarlo e non spostarlo...

    Ma, purtroppo, non è questo il mio caso

    Ok, comunque per essere pignoli, fai prima ad usare il costruttore di File che riceve parent e child, ovvero lascia a lui il compito di comporre il path.
    Che tra l'altro è ovviamente anche più portabile.
    In effetti, una volta ottenuto qualcosa di stabile e funzionabile, dovrei arricchirlo mettendo tutti i path relativi, pescandoli dalla dir attuale, permettendo all'utente di selezionare la directory e così via.

    Di più però non saprei cosa dire, non avendo tutta la situazione sott'occhio.

    directoryOutput che cosa contiene e da dove ti arriva?
    contiene un path assoluto "C:\\applicazione\\files_elaborati" glielo passo io, ma sono sicuro che è corretto (uso la variabile anche altrove, e ha sempre funzionato).

  6. #6
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Mi è venuto un dubbio....

    Come posso controllare se il file è in uso da altri programmi?

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Reiuky
    Mi è venuto un dubbio....

    Come posso controllare se il file è in uso da altri programmi?
    E' ciò che volevo suggerirti io.
    Il fatto che non riesca a spostarlo può dipendere (e il più delle volte è questo il motivo più difficile da scovare) dal fatto che il file è in uso da parte di qualche altro programma.

    L'unico modo è iterare la rinomina in caso di errore, dopo un certo intervallo di tempo.

    Aggiungo anche che lo spostamento tra file-system differenti funziona senza problemi anche tra Win e Linux (una mia applicazione effettua questa operazione centinaia di volte al giorno tra file system NTFS su Win2003 Server e ext3 su Linux tramite directory condivise via Samba).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Ho capito dove stà il problema ma non so come risolverlo.

    Uso una classe di tipo tread (fornita esternamente che non posso modificare ) per aprire la busta digitale. Quindi capita che il file non sia ancora stato rilasciato quando voglio spostarlo.

    Per ora ho risolto scrivendo while( !f.renameTo(...)); però è pericolosissimo, perchè può bloccare il programma. consigli per una soluzione meno pericolosa?

  9. #9
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da Reiuky
    consigli per una soluzione meno pericolosa?
    Applicare un'attesa tra un tentativo e l'altro a volte può funzionare.
    Il problema è che se il Thread di terze parti non rilascia il file entri in un loop infinito... ma la garanzia che il thread rilasci sempre il file te la dovrebbe dare chi ha sviluppato il thread...


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  10. #10
    Utente di HTML.it L'avatar di Reiuky
    Registrato dal
    Jul 2008
    Messaggi
    371
    Ok. aggiudicato per l'attesa.

    Glosh... non lo so usare il metodo wait(1000)

    mi da java.lang.IllegalMonitorStateException


Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.