如何找出重命名为什么()失败?

2022-09-01 09:54:20

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

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

  1. 文件句柄由进程的子进程继承
  2. 防病毒程序正在扫描文件中的病毒,因此已将其打开
  3. 索引器(如 Google 桌面或 Windows 索引服务)打开了该文件

为了帮助找出使文件保持打开状态的原因,请使用 FileMonHandle 等工具。

更新:如果文件仅保持打开状态很短的时间(例如防病毒扫描的情况),则诸如Unlocker之类的工具可能无济于事。但是,如果javaw.exe显示为打开了文件,那就是您的问题。


答案 2

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

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

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

renameTo()仅当存在安全冲突 () 或传入 文件以进行重命名时,才会引发异常。SecurityExceptionnull