`
langgufu
  • 浏览: 2303463 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

请慎用java的File#renameTo(File)方法(转载)

 
阅读更多

原文地址:http://xiaoych.iteye.com/blog/149328

以前我一直以为File#renameTo(File)方法与OS下面的 move/mv 命令是相同的,可以达到改名、移动文件的目的。不过后来经常发现问题:File#renameTo(File)方法会返回失败(false),文件没有移动,又查不出原因,再后来干脆弃用该方法,自己实现一个copy方法,问题倒是再也没有出现过。 

昨天老板同学又遇到这个问题,File#renameTo(File)方法在windows下面工作的好好的,在linux下偶尔又失灵了。回到家我扫了一遍JDK中File#renameTo(File)方法的源代码,发现它调用的是一个本地的方法(native method),无法再跟踪下去。网上有人说该方法在window下是正常的,在linux下面是不正常的。这个很难说通,SUN不可能搞出这种平台不一致的代码出来啊。 

后面在SUN的官方论坛上看到有人提到这个问题“works on windows, don't work on linux”,后面有人回复说是“file systems”不一样。究竟怎么不一样呢?还是没有想出来... 

后面在一个论坛里面发现了某人关于这个问题的阐述: 

引用
In the Unix'esque O/S's you cannot renameTo() across file systems. This behavior is different than the Unix "mv" command. When crossing file systems mv does a copy and delete which is what you'll have to do if this is the case. 

The same thing would happen on Windows if you tried to renameTo a different drive, i.e. C: -> D:



终于明白咯。 

做个实验: 

Java代码   收藏代码
  1. File sourceFile = new File("c:/test.txt");  
  2. File targetFile1 = new File("e:/test.txt");  
  3. File targetFile2 = new File("d:/test.txt");  
  4. System.out.println("source file is exist? " + sourceFile.exists()  
  5.     + ", source file => " + sourceFile);  
  6. System.out.println(targetFile1 + " is exist? " + targetFile1.exists());  
  7. System.out.println("rename to " + targetFile1 + " => "  
  8.     + sourceFile.renameTo(targetFile1));  
  9. System.out.println("source file is exist? " + sourceFile.exists()  
  10.     + ", source file => " + sourceFile);  
  11. System.out.println(targetFile2 + " is exist? " + targetFile2.exists());  
  12. System.out.println("rename to " + targetFile2 + " => "  
  13.     + sourceFile.renameTo(targetFile2));  



结果: 

Java代码   收藏代码
  1. source file is exist? true, source file => c:\test.txt  
  2. e:\test.txt is exist? false  
  3. rename to e:\test.txt => false  
  4. source file is exist? true, source file => c:\test.txt  
  5. d:\test.txt is exist? false  
  6. rename to d:\test.txt => true  



注意看结果,从C盘到E盘失败了,从C盘到D盘成功了。因为我的电脑C、D两个盘是NTFS格式的,而E盘是FAT32格式的。所以从C到E就是上面文章所说的"file systems"不一样。从C到D由于同是NTFS分区,所以不存在这个问题,当然就成功了。 

果然是不能把File#renameTo(File)当作move方法使用。 

可以考虑使用apache组织的commons-io包里面的FileUtils#copyFile(File,File)和FileUtils#copyFileToDirectory(File,File)方法实现copy的效果。至于删除嘛,我想如果要求不是那么精确,可以调用File#deleteOnExit()方法,在虚拟机终止的时候,删除掉这个目录或文件。 

BTW:File是文件和目录路径名的抽象表示形式,所以有可能是目录,千万小心。

 

 

下面原文地址:http://lvxiaoxi.iteye.com/blog/1868440

在使用compass 时,发现重建索引重命名文件失败,看了源码,原来源码用了 File renameTo的方法,于是自己做了试验,结合网上一位朋友的帖子 
http://xiaoych.iteye.com/blog/149328 
下面看我的测试: 
Java代码  收藏代码
  1.              boolean renamed = false;  
  2. File renameToIndexPathFile;  
  3. String path = "D:/apache-tomcat-7.0.6/webapps/cc/index/advertset";  
  4. File indexPathFile = new File(path);  
  5. int count = 1;  
  6. renameToIndexPathFile = new File(path + "-copy" + (count++));   
  7. renamed = indexPathFile.renameTo(renameToIndexPathFile);           
  8. System.out.println(renamed);  


如果把上面代码的path 间隔符改成下面就成功了: 
Java代码  收藏代码
  1. String path = "D:\\apache-tomcat-7.0.6\\webapps\\cc\\index\\advertset";  

 

 

 

分享到:
评论

相关推荐

    请慎用java的File#renameTo(File)方法

    java的file rename方法 ...不过后来经常发现问题:File#renameTo(File)方法会返回失败(false),文件没有移动,又查不出原因,再后来干脆弃用该方法,自己实现一个copy方法,问题倒是再也没有出现过。

    java file类的方法

    ### Java File 类的方法详解 #### 一、简介 在Java编程语言中,`java.io.File`类是一个非常重要的类,它提供了对文件和目录路径名的抽象表示,并且支持一些基本的操作,例如创建、删除文件或目录等。本文将详细...

    java中File类的使用方法 File类的

    * `public boolean renameTo(File f)`: 将文件重命名为指定的文件。 * `public File[] listRoots()`: 获取机器的盘符。 * `public String[] list()`: 列出文件夹下的文件和文件夹。 * `public String[] list...

    java中File类总结

    18. **`renameTo(File dest)`**:重命名文件或移动文件到另一个位置。 19. **`setReadOnly()`**:设置文件为只读。 20. **`toString()`**:返回描述文件状态的字符串。 21. **`toURL()`**:将文件转换为URL对象。 #...

    Better File Rename 绿色汉化版

    Better File Rename 5.7 绿色汉化版 Better File Rename 是一款强大易用的文件批量改名软件。内置最全面的重命名选项。 现已支持64位操作系统。 5.7 英文原版更新说明: ① 添加了 PDF 格式的用户手册 ② 在所有...

    java file 文件操作例子

    boolean renamed = file.renameTo(newFile); if (renamed) { System.out.println("文件重命名成功"); } else { System.out.println("文件重命名失败"); } ``` 6. **路径操作**:`File`类提供了一些方法来处理路径...

    java File类文件的使用

    - `renameTo(File dest)`:将文件或目录重命名为指定的新名称。 3. **文件属性获取**: - `exists()`:判断文件或目录是否存在。 - `isFile()` 和 `isDirectory()`:分别判断是否为文件和目录。 - `canRead()` ...

    Better File Rename v5.7

    "Better File Rename v5.7" 是一个专为Windows用户设计的应用软件,它极大地提升了文件重命名的效率和便利性。作为一个资源管理器的扩展外壳,该工具无缝集成到Windows操作系统中,使得用户在不离开熟悉的文件管理...

    File_java_

    - `renameTo(File dest)`:将文件或目录重命名为指定的新名称。此操作可能因操作系统而异,不总是跨文件系统支持。 - `delete()`:删除文件或空目录。如果文件是目录并且非空,该方法将失败。 4. **属性查询**: ...

    Java 语言File类的详解

    - `boolean renameTo(File dest)`:将文件或目录重命名为指定的新名称,如果目标文件已存在,重命名可能失败。 **六、文件的遍历** - `File[] listFiles()`:列出当前目录下的所有文件和目录,返回File数组。 - `...

    Day36 Java的file类

    - **`boolean renameTo(File dest)`**:重命名文件。 4. **文件判断** - **`boolean isDirectory()`**:判断是否为目录。 - **`boolean isFile()`**:判断是否为文件。 #### 四、具体案例分析 ##### 需求1:...

    Quick File Rename 1.2

    Quick File Rename 1.2是一款轻巧而高效的文件批量重命名工具,专为需要快速更改大量文件后缀名的用户设计。它以其简洁的操作界面和强大的功能,为用户提供了便捷的文件管理体验,尤其对比一些体积庞大、功能复杂的...

    Better File Rename文件重命名工具

    "Better File Rename"是一款高效的文件重命名工具,专为用户提供了丰富多样的文件批量重命名功能,极大地提升了在日常工作中处理大量文件的效率。这款工具不仅适用于个人用户,也广泛应用于企业和团队,使得文件管理...

    linux下用renameTo方法修改java web项目中文件夹名称的实例

    Linux下用renameTo方法修改Java Web项目中文件夹名称的实例 在 Linux 环境中,修改 Java Web 项目中的文件夹名称是一个常见的问题。今天,我们将分享一个使用 renameTo 方法修改 Java Web 项目中文件夹名称的实例。...

    java-io-file类笔记

    这些方法是`File`类的基础操作,但请注意,它们都是异步的,不保证立即反映文件系统的变化。同时,某些操作可能会受操作系统权限和安全策略的影响。在实际应用中,需要进行适当的错误处理和异常捕获。

    java中IO流里面的关于File的讲解源码

    例如,`exists()`检查文件是否存在,`createNewFile()`尝试创建新文件,`delete()`删除文件,`renameTo()`重命名文件。同时,`length()`返回文件大小,`lastModified()`获取文件最后修改时间。 当涉及到IO流时,...

    rename file

    【标题】:“rename file”指的是批量重命名文件的程序,这是一个在IT领域常见的操作,尤其在数据管理和自动化脚本编写中。批量重命名文件能够帮助用户高效地整理大量文件,使其具有更统一、更具描述性的名称,从而...

    java文件路径操作详细(转载)

    - `renameTo(File dest)`: 重命名文件或目录,不保证跨文件系统操作成功。 6. **文件属性**: - `exists()`: 检查文件或目录是否存在。 - `isFile()`: 判断是否为文件。 - `isDirectory()`: 判断是否为目录。 ...

Global site tag (gtag.js) - Google Analytics