如何在目录中交换文件名?

时间:2016-05-03 13:03:16

标签: java

我正在尝试使用这段代码执行此类任务:

    File copyOfFirstVar= tmp1;
    File copyOfSecondVar= tmp2;

    File tmpVar = File.createTempFile("temp", "tempFile");

    tmp1.renameTo(tmpVar)
    tmp2.renameTo(copyOfFirstVar);
    tmp1.renameTo(copyOfSecondVar);

其中tmp1和tmp2是来自File类的对象 - >我要重命名的文件, 但那没有做任何事情。

3 个答案:

答案 0 :(得分:0)

正如评论中所说的那样,您引用了几次相同的Filetemp文件)。

自:

File copyOfFirstVar= tmp1;
File copyOfSecondVar= tmp2;

你的逻辑变为:

tmp1.renameTo(tmpVar);  // now tmp1 and tmpVar are references to the same file
tmp2.renameTo(tmp1);    // now tmp2 and tmp1 are references to the same file
tmp1.renameTo(tmp2);    // see above

因此,您最终得到tmp1tmp2tmpVar三个引用相同File的内容。

您应避免使用File引用进行交换,只需将路径用作String

File copyOfFirstVar= tmp1;
File copyOfSecondVar= tmp2;

String firstPath = copyOfFirstVar.getAbsolutePath();
String secondPath = copyOfSecondVar.getAbsolutePath();

File tmpVar = File.createTempFile("temp", "tempFile");

tmp1.renameTo(tmpVar);
tmp2.renameTo(new File(firstPath));
tmp1.renameTo(new File(secondPath));

另请注意,正如其他人所指出的,如果目的地renameTo存在,File将会失败。

答案 1 :(得分:0)

File.createTempFile(...)将在“temp”文件夹中创建一个物理文件。因此,将另一个文件重命名为该名称将失败,因为文件已经存在。

答案 2 :(得分:0)

您的程序中的问题是您正在更改/交换偶数路径以及文件名,因此即使您执行renameTO,它实际上也会使用相同的旧名称重新命名该文件。

以下是实现您的目标的程序:

public class SwapFileName {

    public static void main(String[] args) {
        File file1 = new File("C:\\temp1\\asd.txt");
        File file2 = new File("C:\\temp2\\dsa.txt");
        boolean isSuccess = swapName(file1, file2);
        System.out.println(isSuccess);
    }
    public static boolean swapName(File tmp1, File tmp2) {
        String path1 = tmp1.getAbsolutePath().substring(0, tmp1.getAbsolutePath().lastIndexOf(File.separator)+1);
        String fileName1 = tmp2.getName();
        File swapFile1 = new File(path1 + File.separator + fileName1);

        String path2 = tmp2.getAbsolutePath().substring(0, tmp2.getAbsolutePath().lastIndexOf(File.separator)+1);
        String fileName2 = tmp1.getName();
        File swapFile2 = new File(path2 + File.separator + fileName2);

        return (tmp1.renameTo(swapFile1) && tmp2.renameTo(swapFile2));

    }
}