Как увеличить значение без цикла for, но исходя из количества раз, которое файл запускается в переполнении стека

У меня есть скрипт, который при запуске создает новый файл в каком-то каталоге. При создании нового файла он проверяет, существует ли файл:

  • Если он существует, он должен добавить 1 к имени файла
  • Если другой файл имеет такое же имя, он должен увеличиваться и добавляться 2,
$filecount = 0;
if (! file_exists ( SOME_DIR . $fileName )) {
echo "not there";
//so save normally
} else {
echo "there";
$fileName  = $fileName."_" .$file_count++.".txt";
// save with number at the end
}

В настоящее время, когда файл запускается несколько раз, он сохраняется только с номером в первый раз, как переменная $filecount снова установлен в 0,

Есть ли работа, чтобы увеличить filename когда его имя повторяется?

1

Решение

Вы можете сделать это

<?php
define('SOME_DIR', '');

$fileName = 'file';
if (! file_exists ( SOME_DIR . $fileName.'.txt' )) {
echo "not there";
//so save normally
}
else{
$files = glob(SOME_DIR.$fileName.'_*.txt');
$counter = count($files)+1;
echo "there";
$fileName  = $fileName."_" .$counter.".txt";
echo $fileName;
// save with number at the end
}

Проверено, работает хорошо для меня

1

Другие решения

Вам нужно где-то хранить количество запусков вашего скрипта. Если вы уже пишете файлы, я бы использовал обычный текстовый файл для хранения количества прогонов.

Другие варианты — использовать метку времени в качестве дедупликатора имени файла.

0

define('SOME_DIR', __DIR__ . '/');
$basename = 'test.txt';
$path = SOME_DIR . $basename;

// Consider clearing stat cache before using `file_exists` and similar
// functions that run `stat`, or `lstat` system calls under the hood.
clearstatcache(true, $path);

if (file_exists($path)) {
$filename = pathinfo($basename, PATHINFO_FILENAME);
$ext      = pathinfo($basename, PATHINFO_EXTENSION);

$files = glob(SOME_DIR . "${filename}_[0-9]*.${ext}", GLOB_BRACE);

$basename = sprintf(
'%s_%d.%s',
$filename,
(count($files) + 1),
$ext
);

$path = SOME_DIR . $basename;
}

// Replace with your logic
touch($path);
0
По вопросам рекламы [email protected]