如何找出为什么renameTo()失败?(How to find out why renameTo(

2019-07-03 14:31发布

我使用的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

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

Answer 1:

这有可能是要重命名失败的原因是该文件仍处于打开状态。 即使你关闭文件,这可能是因为(例如)保持打开:

  1. 文件句柄是由您的进程的子继承
  2. 防病毒程序扫描病毒文件,所以把它打开
  3. 索引器(如谷歌桌面或Windows索引服务)打开了该文件

为了帮助找出什么是保持文件打开,使用的工具如FileMon的和处理 。

更新:如解锁的工具可能没有帮助,如果在很短的时间该文件只保持打开(如将是一个防病毒扫描的情况下)。 但是,如果javaw.exe的显示为具有文件打开,那是你的问题就在这里。



Answer 2:

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



Answer 3:

三大理由renameTo可能失败(Android设备,但你也可能会发现这很有用)!

1)如果您正在从地方文件夹位置B,目标文件夹可能是一个文件! 使destinationFolder.mkdirs()使它成为一个文件!

2)目标文件夹可能已经存在! 删除destinationFolder,这样就可以使用renameTo旧文件移动到新位置

3)移动内部存储到外部存储需要的权限,因为读取和写入SD卡需要许可!



Answer 4:

如果没有异常被抛出(我假设你会注意到) renameTo()只返回true或false来指示重命名成功与否,不给任何其他信息。

由于它是Windows的故障最有可能表明该文件正在使用中。 这会发生,因为其他进程已打开。 更可能的是,你要么处理不写完它,或者你忘了关文件你写完之后。

这也有可能是你在一个无效的路径传递,或者给了一个不存在的路径File的构造。

renameTo()如果有一个安全违规(只抛出异常SecurityException ),或者如果您在通过null的文件进行重命名。



Answer 5:

我有一个类似的问题,但这是UNIX。
重命名随机失败。 我重新启动过程3〜4次,最后去了成功。
FYI文件是由同一个进程创建和相同的过程将其重命名..



Answer 6:

这也有可能是因为您没有足够的权限,你可以不重命名文件。 在Unix上,这很简单。 在Win10,嗯......看如https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html



Answer 7:

文件f =新的文件(文件夹+文件); 有,如果你有写正确的路径.. f.exists()验证; 别人是存在的,并返回讨论procmon虚假验证是否看了..



文章来源: How to find out why renameTo() failed?