代码之家  ›  专栏  ›  技术社区  ›  janetsmith

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

  •  32
  • janetsmith  · 技术社区  · 16 年前

    有没有办法找出失败的原因?

    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 回复  |  直到 8 年前
        1
  •  26
  •   Vinay Sajip    16 年前

    1. 防病毒程序正在扫描文件中的病毒,因此它已打开
    2. 索引器(如Google Desktop或Windows索引服务)已打开该文件

    FileMon Handle .

    更新: 如果文件仅在很短的时间内保持打开状态(如防病毒扫描),则解锁器等工具可能无济于事。但是,如果javaw.exe显示为打开了文件,那就是你的问题所在。

        2
  •  3
  •   Steven Doggart    13 年前

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

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

    也可能是您传递了无效的路径,或者给了不存在的路径 File

    重命名To() SecurityException null 以便重命名文件。

        3
  •  3
  •   coolcool1994    11 年前
    File o=new File("d:/old.txt");
    File n=new File("d:/new.txt");
    n.delete();
    o.renameTo(n);
    

    n.delete()

    o.rename(n)

        4
  •  2
  •   Dave Ray    16 年前

    我也遇到过类似的问题,但这是unix的问题。
    重命名随机失败。我重新启动了这个过程3到4次,最终取得了成功。

        5
  •  1
  •   oers Alfian Busyro    14 年前

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

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

        6
  •  0
  •   Per Lindberg    8 年前

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

        7
  •  -4
  •   ste    14 年前

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

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