2009-08-25 13 views
27

Estoy usando WinXP. Yo uso java para generar una lista de archivos. El archivo se creará como abc.txt.temp al principio, y después de completar la generación, se cambiará a abc.txt.¿Cómo saber por qué renameTo() falló?

Sin embargo, cuando generaba los archivos, algunos de los archivos no se podían renombrar. Sucede al azar.

¿Hay alguna forma de averiguar el motivo por el que falló?

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

Y el resultado:

[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 

me gustaría saber un enfoque sistemático para averiguar la razón. Gracias.

+0

¿Está atrapando las excepciones que se lanzan? – seth

+0

no. ninguna excepción en absoluto. Solo devuelve falso. – janetsmith

+0

Actualicé mi respuesta. –

Respuesta

24

Es posible que el motivo por el que el cambio de nombre haya fallado sea porque el archivo aún está abierto. Incluso si usted está cerrando el archivo, se podría declarar abierta debido a (por ejemplo):

mango
  1. Un archivo es heredado por un subproceso de su proceso de
  2. Un programa antivirus está analizando el archivo de virus, y también lo ha abierto
  3. un indexador (como Google Desktop o el servicio de indexación de Windows) tiene el archivo abierto

Para ayudar a determinar lo que es mantener el archivo abierto, utilizar herramientas tales como FileMon y Handle.

Actualización: Una herramienta como Unlocker puede no ser útil, si el archivo solo se mantiene abierto durante un tiempo muy corto (como sería el caso de un análisis antivirus). Sin embargo, si se muestra que javaw.exe tiene el archivo abierto, ese es su problema allí mismo.

+0

Estoy usando Unlocker. y solo muestra "javaw.exe" como el único casillero. :( – janetsmith

+0

Creo que las aplicaciones de escaneo como antivirus e indexadores no deberían ser capaces de mantener el archivo y evitar que se modifique o renombre ... ¿Es este el caso en WinXP? – Yuval

+0

No tienen el archivo abierto por mucho tiempo, pero normalmente busca cambios de archivos y escanea después de las actualizaciones del archivo. Si escribe en un archivo, lo cierra y luego intenta cambiarle el nombre, el archivo * podría * mantenerse abierto en ese momento (aunque no por mucho tiempo). –

2

Si no se lanzaron excepciones (supongo que lo habría notado) renameTo() solo devuelve verdadero o falso para indicar si el cambio de nombre fue exitoso o no y no proporciona ninguna información adicional.

Dado que es Windows, una falla probablemente indica que el archivo está actualmente en uso. Esto sucedería porque algún otro proceso lo tiene abierto. Sin embargo, es más probable que su proceso no haya terminado de escribirse o haya olvidado cerrar el archivo después de que haya terminado de escribirlo.

También es posible que usted pasó en una ruta no válida, o la diste un camino inexistente a la File constructor.

renameTo() sólo se generan excepciones si hay una violación de seguridad (SecurityException) o si se pasa en un null para el archivo para cambiar el nombre.

+1

Sé que devuelve falso, pero no da ninguna pista de por qué falló. He cerrado todos los outputStream.close() y lo configuré en nulo. Pero todavía falló al azar. Digamos que generé 10 archivos, file0.tmp ... file9.tmp, podría ser que file5.tmp no pudo cambiar a file5.txt. – janetsmith

1

Tuve un problema similar, pero esto es con Unix.
Falló el cambio de nombre aleatoriamente. Reinicié el proceso de 3 a 4 veces y finalmente fui al éxito.
FYI el archivo fue creado por el mismo proceso y el mismo proceso lo renombra ...

-4

Archivo f = new Archivo (carpeta + archivo); verificar con si tiene la ruta correcta de escritura .. f.exists(); else existe y devuelve la verificación falsa con procMon si se mira ...

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

n.delete(): hay que eliminar el archivo (nuevo.txt) si existe.

o.rename(n): para que el archivo (old.txt) cambia su nombre por nuevo.txt

+2

Hice eso mismo y aún recibí una devolución falsa por cambiar el nombre. El archivo estaba cerrado y nada más lo tenía. Windows. Simplemente ... Windows. – stu

3

tres razones principales renameTo puede fallar (por Android, pero también puede resultar útil)!

1) Si está moviendo carpetas de un lugar a un lugar b, ¡la carpeta de destino puede ser un archivo! ¡Haga que destinationFolder.mkdirs() lo convierta en un archivo!

2) ¡Es posible que la carpeta de destino ya exista! Elimine el archivoForder para que pueda usar renameTo para mover el archivo anterior a esa nueva ubicación

3) Mover el almacenamiento interno al almacenamiento externo requiere permiso, ¡porque leer y escribir en la tarjeta SD requiere permiso!

+0

Encontré esta pregunta a través de Google, y el número 2 fue mi problema ¡Gracias por la ayuda! –

+1

"¡Haga que destinationFolder.mkdirs() lo convierta en un archivo!" ¿Eh? – EntangledLoops

Cuestiones relacionadas