2009-08-25 18 views
27

Sto usando WinXP. Io uso Java per generare un elenco di file. Il file verrà creato come abc.txt.temp all'inizio e, dopo aver completato la generazione, verrà rinominato in abc.txt.Come scoprire perché renameTo() non è riuscito?

Tuttavia, durante la generazione dei file, alcuni file non sono stati rinominati. Accade casualmente.

C'è comunque qualche motivo per scoprire perché non è riuscito?

int maxRetries = 60; 
logger.debug("retry"); 
while (maxRetries-- > 0) 
{ 
    if (isSuccess = file.renameTo(file2)) 
    { 
     break; 
    } 
    try 
    { 
     logger.debug("retry " + maxRetries); 
     Thread.sleep(1000); 
    } 
    catch (InterruptedException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

//file.renameTo(file2); 
Thread.currentThread().getThreadGroup().getParent().list(); 

E il risultato:

[DEBUG][2009-08-25 08:57:52,386] - retry 1 
[DEBUG][2009-08-25 08:57:53,386] - retry 0 
java.lang.ThreadGroup[name=system,maxpri=10] 
    Thread[Reference Handler,10,system] 
    Thread[Finalizer,8,system] 
    Thread[Signal Dispatcher,9,system] 
    Thread[Attach Listener,5,system] 
    java.lang.ThreadGroup[name=main,maxpri=10] 
     Thread[main,5,main] 
     Thread[log4j mail appender,5,main] 
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false 

vorrei sapere un approccio sistematico per capire il motivo. Grazie.

+0

Stai riscontrando eccezioni generate? – seth

+0

no. nessuna eccezione. Restituisce solo falso. – janetsmith

+0

Ho aggiornato la mia risposta. –

risposta

24

È possibile che il motivo della mancata corrispondenza del file sia che il file sia ancora aperto. Anche se si sta chiudendo il file, potrebbe essere mantenuto aperto a causa di (ad esempio):

maniglia
  1. Un file viene ereditata da un sottoprocesso del processo
  2. un programma anti-virus è la scansione del file per virus, e così ha aperto
  3. un indicizzatore (come Google Desktop o il servizio di indicizzazione di Windows) ha il file aperto

Per aiutare a scoprire che cosa sta mantenendo il file aperto, utilizzare strumenti quali FileMon e Handle.

Aggiornamento: Uno strumento come Unlocker potrebbe non essere d'aiuto, se il file viene tenuto aperto solo per un tempo molto breve (come nel caso di una scansione anti-virus). Tuttavia, se viene visualizzato javaw.exe con il file aperto, il problema è proprio lì.

+0

Sto usando Unlocker. e mostra solo "javaw.exe" come unico armadietto. :( – janetsmith

+0

Penso che le applicazioni di scansione come anti-virus e indicizzatori non dovrebbero essere in grado di contenere il file e impedire che venga alterato o rinominato ... È questo il caso in WinXP? – Yuval

+0

Non tengono il file è aperto a lungo, ma in genere controlla le modifiche ai file e scansiona dopo gli aggiornamenti del file. Se scrivi su un file, chiudilo e poi prova a rinominarlo, il file * potrebbe * essere mantenuto aperto in quel punto (anche se non per molto tempo) –

2

Se nessuna eccezione è stata lanciata (presumo che avresti notato che) renameTo() restituisce solo vero o falso per indicare se il cambio di nome è riuscito o meno e non fornisce alcuna informazione aggiuntiva.

Poiché è Windows, un errore indica molto probabilmente il file è attualmente in uso. Ciò accadrebbe perché alcuni altri processi lo hanno aperto. Più probabilmente, però, il tuo processo non ha finito di scriverlo o ti sei dimenticato di chiudere il file dopo averlo scritto.

È anche possibile che sia stato passato un percorso non valido oppure che abbia fornito un percorso inesistente al costruttore File.

renameTo() getterà solo eccezioni se c'è una violazione della sicurezza (SecurityException) o se si passa in un null per il file da rinominare.

+1

So che restituisce false, ma non dà la minima idea del perché non è riuscito. Ho chiuso tutto l'outputStream.close() e lo ha impostato su null. Ma è ancora fallito a caso. Diciamo che ho generato 10 file, file0.tmp ... file9.tmp, potrebbe essere che file5.tmp non sia cambiato in file5.txt. – janetsmith

1

Ho avuto un problema simile, ma questo è con Unix.
La rinomina non è riuscita in modo casuale. Ho riavviato il processo da 3 a 4 volte e infine sono andato al successo.
FYI il file è stato creato con la stessa procedura e lo stesso processo lo rinomina ..

-4

File f = nuovo File (cartella + file); verifica con se hai percorso corretto scrittura .. f.exists(); else esiste e restituisce false verifica con procMon se si guarda ..

2
File o=new File("d:/old.txt"); 
File n=new File("d:/new.txt"); 
n.delete(); 
o.renameTo(n); 

n.delete(): Abbiamo bisogno di eliminare il file (new.txt), se esiste.

o.rename(n): in modo che il file (old.txt) viene rinominato come new.txt

+2

Ho fatto quella cosa e ho ancora ricevuto il falso indietro da rinominare.Il file è stato chiuso e nient'altro aveva Windows 1. Solo. Windows. – stu

3

tre ragioni principali renameTo può fallire (per Android, ma si può anche trovare questo utile)!

1) Se si spostano le cartelle da posto a a posto b, la cartella di destinazione potrebbe essere un file! Crea destinationFolder.mkdirs() per trasformarlo in un file!

2) La cartella di destinazione potrebbe già esistere! Eliminare DestinationFolder in modo che sia possibile utilizzare renameTo per spostare il vecchio file nella nuova posizione

3) Lo spostamento della memoria interna su una memoria esterna richiede l'autorizzazione, poiché la lettura e la scrittura su scheda SD richiedono l'autorizzazione!

+0

Ho trovato questa domanda via Google, e # 2 era il mio problema Grazie per l'aiuto! –

+1

"Crea il destinationFolder.mkdirs() per trasformarlo in un file!" Huh? – EntangledLoops

Problemi correlati