delete - rename file java
¿Cómo averiguar por qué renameTo() falló? (7)
Archivo f = nuevo Archivo (carpeta + archivo); verifique con si tiene una ruta correcta de escritura ... f.exists (); else existe y devuelve una verificación falsa con procMon si se mira ...
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.
Sin embargo, cuando genero los archivos, algunos de los archivos no pudieron ser renombrados. Sucede al azar.
¿Hay alguna forma de averiguar el motivo por el cual 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 conocer un enfoque sistemático para descubrir la razón. Gracias.
Es posible que la razón por la que el cambio de nombre haya fallado sea porque el archivo aún está abierto. Incluso si está cerrando el archivo, podría mantenerse abierto debido a (por ejemplo):
- Un proceso de archivo se hereda por un subproceso de su proceso
- Un programa antivirus está escaneando el archivo en busca de virus, y así lo ha abierto
- Un indexador (como Google Desktop o el servicio de indexación de Windows) tiene el archivo abierto
Para ayudar a descubrir qué es lo que mantiene el archivo abierto, use herramientas como FileMon y Handle .
Actualización: una herramienta como Unlocker puede no ser de ayuda, 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.
Si no se lanzaron excepciones (supongo que lo habrá notado), renameTo()
solo devuelve verdadero o falso para indicar si el cambio de nombre fue exitoso o no y no brinda información adicional.
Dado que es Windows, es probable que una falla indique 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 haya pasado una ruta no válida o que haya dado una ruta de acceso inexistente al constructor File
.
renameTo()
solo lanzará excepciones si hay una violación de seguridad ( SecurityException
) o si pasa un null
para que el archivo cambie de nombre.
También es posible que no cambie el nombre del archivo porque no tiene suficientes permisos. En Unix, eso es simple. En Win10, bueno ... ver eg https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html
Tres razones principales para cambiar el nombre de A puede fallar (para Android, ¡pero también puede ser útil)!
1) Si está moviendo carpetas de un lugar a a un lugar b, ¡la carpeta de destino puede ser un archivo! ¡Haga que destinationFolder.mkdirs () lo convierta en un archivo!
2) ¡La carpeta de destino ya puede existir! Elimine el folder de destino 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!
Tuve un problema similar, pero esto es con Unix.
El cambio de nombre falló al azar. 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 cambia de nombre.
File o=new File("d:/old.txt");
File n=new File("d:/new.txt");
n.delete();
o.renameTo(n);
n.delete()
: Necesitamos eliminar el archivo (new.txt) si existe.
o.rename(n)
: para que el archivo (old.txt) se renombre como new.txt