如何找出renameTo()失败的原因?

时间:2009-08-25 00:00:07

标签: java file file-io file-rename

我正在使用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

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

8 个答案:

答案 0 :(得分:27)

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

  1. 文件句柄由流程的子流程继承
  2. 反病毒程序正在扫描文件中的病毒,因此将其打开
  3. 索引器(例如Google桌面或Windows索引服务)打开文件
  4. 要帮助找出保持文件处于打开状态的内容,请使用FileMonHandle等工具。

    更新:如果文件仅在非常短的时间内保持打开状态(如防病毒扫描的情况),则解锁程序等工具可能无效。但是,如果javaw.exe显示为打开文件,那就是你的问题。

答案 1 :(得分:3)

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

答案 2 :(得分:3)

重新命名的三个主要原因可能会失败(对于Android,但您也可能会觉得这很有用)!

1)如果您要将文件夹从a放置到位置b,则目标文件夹可能是文件!使destinationFolder.mkdirs()使其成为一个文件!

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

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

答案 3 :(得分:2)

如果没有抛出异常(我假设你会注意到这一点)renameTo()只返回true或false以指示重命名是否成功,并且不提供任何其他信息。

由于它是Windows,故障很可能表示该文件当前正在使用中。这会发生,因为其他一些进程打开了它。但更有可能的是,您的过程要么没有写完,要么在编写完成后忘记关闭文件。

您也可能传入了无效路径,或者为File构造函数提供了不存在的路径。

renameTo()只会在出现安全漏洞(SecurityException)或传入null文件以重命名时才会抛出异常。

答案 4 :(得分:1)

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

答案 5 :(得分:0)

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

答案 6 :(得分:0)

我在 Mac 上看到了同样的事情。我有一个在单个线程中创建 163,000 个文件的进程。它跳过创建任何已经存在的文件。为避免部分文件问题,当需要写入文件时,它会写入一个临时文件 (.../dir/tmp.filename),然后将其重命名 (.../dir/filename)。

我运行了一次(从 IntelliJ 内部),然后运行窗口消失了,这很奇怪。我重新启动 IntelliJ 并再次运行它,并开始在我的一堆(但不是全部)文件重命名时出错。事实证明,即使 IntelliJ(已启动它)已退出,我之前运行的 java 进程仍在运行。所以我有两个进程寻找相同文件的存在并互相踩踏。

答案 7 :(得分:-4)

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