создать файл с именем на основе того, что уже существует в папке - PullRequest
2 голосов
/ 16 января 2010

Я хочу создать новый файл в папке с существующими файлами с именами в числовом порядке, например. 1, 2, 3, 4 ...

Я хочу проверить, какой номер является последним, а затем создать файл с одним номером над этим.

я знаю, что должен использовать file_exists, но я точно не знаю, как его использовать, возможно, в цикле for? но как?

было бы неплохо, если бы кто-нибудь дал мне подсказку

Ответы [ 3 ]

5 голосов
/ 16 января 2010

Я думаю, что это ваша лучшая ставка ( см. ревизии для предыдущих версий ):

$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();

2 голосов
/ 16 января 2010

Может, вот так?

$name = 'filename';
$ext = '.txt';
$i = 1;
$tmpname = $name . $ext;
while(file_exists($tmpname)) {
  $i++;
  $tmpname = $name . $i . $ext;
}

// $tmpname will be a unique filename by now
1 голос
/ 16 января 2010

в одну сторону.представьте себе имена файлов 1.txt, 2.txt и т. д.

$dir = "/path";
chdir($dir);
$files = glob("[0-9]*.txt");
print "Files aftering globbing: ";
print_r($files);
sort($files,SORT_NUMERIC);
print "After sorting using numeric sort: ";
print_r($files);
# get latest file
$newest=end($files);
$s=explode(".",$newest);
$s[0]=$s[0]+1;
$newname=$s[0].".txt";
touch($newname);

output

$ ls *txt
10.txt  11.txt  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt

$ php test.php
Files aftering globbing: Array
(
    [0] => 1.txt
    [1] => 10.txt
    [2] => 11.txt
    [3] => 2.txt
    [4] => 3.txt
    [5] => 4.txt
    [6] => 5.txt
    [7] => 6.txt
    [8] => 7.txt
    [9] => 8.txt
    [10] => 9.txt
)
After sorting using numeric sort: Array
(
    [0] => 1.txt
    [1] => 2.txt
    [2] => 3.txt
    [3] => 4.txt
    [4] => 5.txt
    [5] => 6.txt
    [6] => 7.txt
    [7] => 8.txt
    [8] => 9.txt
    [9] => 10.txt
    [10] => 11.txt
)

$ ls *.txt
10.txt  11.txt  **12.txt**  1.txt  2.txt  3.txt  4.txt  5.txt  6.txt  7.txt  8.txt  9.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...