У меня возникла проблема с созданием программы, которая читает файлы из папки, сохраняет их в массиве, перетасовывает элементы и затем переименовывает их. Идея заключалась в перетасовке папки с фотографиями, поэтому каждый раз, когда я хотел их просматривать, они были бы в совершенно ином порядке.
Ниже приведен метод, который я использую для рандомизации индексов массива файлов с использованием 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.
Я уверен, что это что-то простое, но я не могу понять, что.
Я предполагаю, что он не только пропускает некоторые цифры, но и фактически удаляет некоторые файлы! При переименовании файлов вы можете переписать некоторые уже существующие файлы. Возьмите следующий пример: у вас есть 3 файла: 0.jpg, 1.jpg, 2.jpg. Они должны быть переименованы следующим образом (возможный результат вашего перетасовки):
0.jpg -> 1.jpg
1.jpg -> 2.jpg
2.jpg -> 0.jpg
Это будет работать, если все файлы будут переименованы в одно и то же время. Но если они будут переименованы последовательно, первое переименование (0.jpg → 1.jpg
) перепишет "старое" 1.jpg. Когда "старый" 1.jpg
следует переименовать, на самом деле новый 1.jpg
(= old 0.jpg
) переименован в 2.jpg
, переписав "старый" 2.jpg
. И затем этот файл снова будет переименован в 0.jpg
. Итак, вы получите только 0.jpg
(что в этом случае на самом деле то же самое, что и оригинал 0.jpg
), но вы перезаписали и, таким образом, потеряли других.
В зависимости от вашего перетасовки вы можете переписать только некоторые из файлов и, таким образом, просмотреть некоторые числа, пропущенные.
Как его решить? 2 Варианты: 1) переместите файлы в новый каталог, а затем в конце удалите старый каталог (теперь он должен быть пустым, поскольку все файлы были перемещены) и переименуйте новый каталог в имя исходного каталога. 2) сначала переименуйте файлы, чтобы включить некоторый префикс, например "tmp_" + j + "." + extension
"tmp_" + j + "." + extension
, и после того, как все файлы были переименованы, переименуйте файлы снова, чтобы удалить префикс.
Оба варианта гарантируют, что файл не будет перезаписан случайно.