Я думаю, что это ваша лучшая ставка ( см. ревизии для предыдущих версий ):
$files = glob('/path/to/dir/*'); // get all files in folder
natsort($files); // sort
$lastFile = pathinfo(array_pop($files)); // split $lastFile into parts
$newFile = $lastFile['filename'] +1; // increase filename by 1
if(file_exists("/path/to/dir/$newFile")) { // do not write file if it exists
die("$newFile aready exists");
}
file_put_contents("/path/to/dir/$newFile", 'stuff'); // write new file
Пока ваши имена файлов в папке начинаются с цифр, это всегда должно записывать имя файла с наибольшим номером, увеличенное на единицу, например,
1,5,10 => writes file 11
1.txt, 5.gif, 10.jpg => writes file 11
1, 5.txt, 10_apple.txt => writes file 11
Если есть файл , а не , начинающийся с числа, вышеуказанный подход не будет работать, потому что числасортируются перед символами и, таким образом, ничего не будет записано, например,
1,5,10,foo => foo+1 equals 1, already exists, nothing written
Вы можете обойти это, изменив шаблон для glob на /path/[0-9]*
, который будет соответствовать только файлам, начинающимся с цифры.Это должно быть довольно солидно.
Примечание natsort
ведет себя по-разному в разных ОС.Вышеописанное отлично работает на моем компьютере с Windows, но вам нужно проверить полученный порядок сортировки, чтобы он работал на вашем конкретном компьютере.
См. Руководство для получения дополнительной информации о том, как использовать glob()
, natsort()
и pathinfo()
;