如何找出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 

我想知道一种系统的方法来找出原因。 谢谢。

重命名失败的原因可能是文件仍处于打开状态。 即使您关闭文件,它也可以保持打开状态,因为(例如):

  1. 文件句柄由进程的子进程inheritance
  2. 防病毒程序正在扫描文件中的病毒,因此它已打开
  3. 索引器(例如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 )或者为要重命名的文件传入nullrenameTo()将仅抛出exception。

我有一个类似的问题,但这是与unix。
重命名随机失败。 我重新开始这个过程3到4次,最后取得了成功。
仅供参考,该文件由同一进程创建,同一进程将其重命名为..

您也可能无法重命名该文件,因为您没有足够的权限。 在Unix上,这很简单。 在Win10上,嗯…请参阅https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html

文件f =新文件(文件夹+文件); validation你是否写了正确的路径.. f.exists(); 如果被查看,则存在并返回falsevalidation与procMon