32

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

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

4

8 回答 8

32

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

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

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

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

于 2009-08-25T00:20:22.773 回答
3

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

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

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

renameTo()SecurityException只有在存在安全违规 ( ) 或您传入 anull以使文件重命名时才会抛出异常。

于 2009-08-25T00:19:15.287 回答
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

于 2012-10-11T19:02:08.377 回答
3

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

1) 如果您将文件夹从 a 地移动到 b 地,则目标文件夹可能是一个文件!将destinationFolder.mkdirs() 设为文件!

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

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

于 2014-12-15T14:21:14.890 回答
2

我有一个类似的问题,但这是与 unix 的。
重命名随机失败。我重新启动了该过程 3 到 4 次,终于成功了。
仅供参考,该文件是由同一进程创建的,并且同一进程将其重命名..

于 2012-01-03T06:49:37.427 回答
0

It is also possible that you may not rename the file because you don't have sufficient permissions. On Unix, that's simple. On Win10, well... see e.g. https://www.sevenforums.com/tutorials/1911-take-ownership-shortcut.html

于 2018-06-15T08:37:40.120 回答
0

I'm seeing the same thing on Mac. I have a process that creates 163,000 files in a single thread. It skips creating any file that already exists. To avoid a partial file problem, when it comes time to write the file, it writes a temp file (.../dir/tmp.filename) and then renames it (.../dir/filename).

I ran it once (from inside IntelliJ), and then the run window disappeared, which was odd. I restarted IntelliJ and ran it again, and started getting errors on a bunch (but not all) of my file renames. It turned out that my previously-running java process was still running, even though IntelliJ (which had launched it) had quit. So I had two processes looking for the existence of the same files and stepping on each others' toes.

于 2021-03-02T18:16:20.123 回答
-4

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

于 2012-01-07T18:44:41.377 回答