如何找出renameTo()失败的原因?
我正在使用WinXP。 我用java生成一个文件列表。 该文件最初将创建为abc.txt.temp,在完成生成后,它将重命名为abc.txt。
但是,当我生成文件时,某些文件无法重命名。 它是随机发生的。
无论如何都要找出失败的原因吗?
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();
结果如下:
[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
我想知道一种系统的方法来找出原因。 谢谢。
重命名失败的原因可能是文件仍处于打开状态。 即使您关闭文件,它也可以保持打开状态,因为(例如):
- 文件句柄由进程的子进程inheritance
- 防病毒程序正在扫描文件中的病毒,因此它已打开
- 索引器(例如Google桌面或Windows索引服务)将文件打开
为了帮助找出保持文件打开的内容,请使用FileMon和Handle等工具。
更新:如果文件仅在非常短的时间内保持打开状态(如反病毒扫描的情况),则解锁器等工具可能无济于事。 但是,如果javaw.exe显示为打开文件,那就是你的问题。
File o=new File("d:/old.txt"); File n=new File("d:/new.txt"); n.delete(); o.renameTo(n);
n.delete()
:如果存在,我们需要删除文件(new.txt)。
o.rename(n)
:以便将文件(old.txt)重命名为new.txt
重命名的三个主要原因可能会失败(对于Android,但您也可能会觉得这很有用)!
1)如果要将文件夹从a位置移动到位置b,目标文件夹可能是文件! 使destinationFolder.mkdirs()使其成为一个文件!
2)目标文件夹可能已存在! 删除destinationFolder,以便您可以使用renameTo将旧文件移动到该新位置
3)将内部存储移动到外部存储需要许可,因为读取和写入SD卡需要许可!
如果没有抛出exception(我假设你会注意到这一点) renameTo()
只返回true或false以指示重命名是否成功,并且不提供任何其他信息。
由于它是Windows,故障很可能表示该文件当前正在使用中。 这会发生,因为其他一些进程已打开。 但更有可能的是,您的进程要么没有完成编写,要么在编写完成后忘记关闭文件。
您也可能传入了无效路径,或者为File
构造函数提供了不存在的路径。
如果存在安全违规( SecurityException
)或者为要重命名的文件传入null
, renameTo()
将仅抛出exception。
我有一个类似的问题,但这是与unix。
重命名随机失败。 我重新开始这个过程3到4次,最后取得了成功。
仅供参考,该文件由同一进程创建,同一进程将其重命名为..
您也可能无法重命名该文件,因为您没有足够的权限。 在Unix上,这很简单。 在Win10上,嗯…请参阅https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html
文件f =新文件(文件夹+文件); validation你是否写了正确的路径.. f.exists(); 如果被查看,则存在并返回falsevalidation与procMon