1

我知道这可能已经在这里被回答了一百万次,但我所看到的一切都没有帮助我。这是我的代码:

for(File g: f.listFiles()){
    for(File h : g.listFiles()){
        try{
            Scanner s = new Scanner(h);
            String timestamp = s.next().split("[?]")[4];
            File z = new File(h.getAbsolutePath().split("[.]")[0] + timestamp + h.getAbsolutePath().split("[.]")[1]);
            boolean q = h.renameTo(z);
        }catch(Exception e){

        }
    }
}

我检查了 File z 是否存在,但它不存在。我检查了文件 h 是否存在并且确实存在。我已经仔细检查了 h 是绝对路径。如果我打印 z 的绝对路径,我会得到正确的路径。f 中的目录或 g 中的文件均未打开。h 表示的文件未打开。Windows 不允许我的程序重命名它的文件上是否有一些标志集或某些东西?

4

3 回答 3

3

我的猜测是您遇到的问题与我在这里遇到的问题类似文件删除/移动失败

尝试对扫描仪使用 FileinputStreams

FileInputStream fin = new FileInputStream(h);
fin.open()
Scanner s = new Scanner(fin);
//do work
fin.close()

并在重命名之前关闭流

于 2012-07-19T22:41:43.830 回答
2

renameTo 的行为因平台而异。在一个平台上成功的操作可能在另一个平台上失败。例如,在我的本地开发工作站 (OS X) 上,一切都按预期工作。在生产系统 (Solaris) 上,renameTo 始终失败。我终于确定当文件位于不同的分区时它失败了。显然这里不是这种情况,但它说明该方法可以以意想不到的方式运行。

要获得一致的行为,请将数据复制到新文件,然后删除原始文件。

于 2012-07-19T22:52:11.203 回答
1

我有一个几乎相同的问题。一些重命名案例成功,一些失败。对于那些失败的情况,我发现源文件路径和目标文件路径不在同一个文件系统中。在我的情况下,NTFS 安装了另一个文件系统,目标文件将被移动到该文件系统。由于重命名函数的最初目的只是重命名一个名称,而不是移动相关文件的数据。如果源文件路径和目标文件路径都在不同的文件系统中,则某些版本的 JVM 在某些平台上会失败。实际上,这是 java.io 中的一个错误,Solaris 已在新版本中修复了此错误。祝你好运!

永远快乐,

于 2013-06-07T20:34:37.497 回答