用于重命名文件的程序问题

时间:2014-11-23 20:41:52

标签: java eclipse windows file

我在编写一个从文件夹中读取文件的程序,将它们存储在一个数组中,对其元素进行洗牌然后重命名它们时遇到了问题。这个想法是随机播放带有照片的文件夹,所以每次我想查看它们他们将处于一个完全不同的秩序。

下面是我使用util.Random随机化文件数组索引的方法。

public static File[] RandomizeArray(File[] array){
    Random rgen = new Random();  // Random number generator         

    for (int i=0; i<array.length; i++) {
        int randomPosition = rgen.nextInt(array.length);
        File temp = array[i];
        array[i] = array[randomPosition];
        array[randomPosition] = temp;
    }

    return array;
}

这是我的主要内容:

 public static void main(String[] argv) throws IOException {

        String absolutePath = "C:\\Users\\test";
        File dir = new File(absolutePath);
        File[] filesInDir = dir.listFiles();

        RandomizeArray(filesInDir);

        for(int j = 0 ; j < filesInDir.length ; j++) {
            String name = filesInDir[j].getName();
            int p = name.indexOf('.');
            String extension = name.substring(p + 1);
            String newName = Integer.toString(j)+"."+extension;
            String newPath = absolutePath + "\\" + newName;
            filesInDir[j].renameTo(new File(newPath));
            System.out.println(name + " changed to " + newName);
        }

    }
} 

问题是,当我第一次在文件夹“test”上运行它时,一切顺利,我得到一个文件夹,其中包含0.jpg,1.mpeg,2.png等文件,但第二次有一些具有相同名称和实例的文件,例如,从12.jpg到14.jpg并跳过13。

我确定它的一些简单但我无法弄清楚是什么。

1 个答案:

答案 0 :(得分:0)

我的猜测是它不仅会跳过一些数字,而且实际上会删除一些文件! 重命名文件时,最终可能会覆盖一些现有文件。举个例子:你有3个文件:0.jpg,1.jpg,2.jpg。它们应该重命名如下(改组的可能结果):

0.jpg -> 1.jpg
1.jpg -> 2.jpg
2.jpg -> 0.jpg

如果同时重命名所有文件,这将有效。但如果将它们重新命名,则第一次重命名(0.jpg -> 1.jpg)将覆盖&#34; old&#34; 1.JPG。当&#34; old&#34;应该重命名1.jpg,实际上新的1.jpg(=旧0.jpg)被重命名为2.jpg,覆盖旧的&#34;} 2.jpg。然后,该文件再次重命名为0.jpg。 因此,您最终只会使用0.jpg(在这种情况下实际上与原始0.jpg相同),但您已被覆盖,从而丢失了其他人。

根据您的改组,您可能最终只会覆盖部分文件,因此会跳过一些数字。

如何解决? 2变种: 1)将文件移动到新目录,然后最后删除旧目录(它现在应该为空,因为所有文件都已移动)并将新目录重命名为原始目录的名称。 2)首先重命名文件以包括一些前缀,例如"tmp_" + j + "." + extension,并且在重命名所有文件后,再次重命名文件以删除前缀。

两种变体都确保没有意外覆盖文件。