Безопасно ли использовать array_slice для удаления записей scandir dot и dot-dot?

Я хочу использовать array_slice с scandir в моем сценарии PHP.

Нормальное использование:

<?php

$files = scandir('/path/to/files');

foreach($files as $file) {
    if($file != '.' && $file != '..') {
        // Do something here...
    }
}

Мой пример:

<?php

$files = array_slice(scandir('/path/to/files'), 2);

foreach($files as $file) {
    // Do something here...
}

Я сомневаюсь, безопасно или нет использовать этот тип логики?

2 ответа

Решение

Это определенно не безопасно. В следующем примере создается каталог с файлом с именем !, Когда Scandir сортирует результаты, ! появляется раньше . а также ..:

mkdir('test');
touch('test/!');
print_r(scandir('test'));
unlink('test/!');
rmdir('test');

Выход:

Array
(
    [0] => !
    [1] => .
    [2] => ..
)

В общем, это будет проблемой для всех имен файлов, начинающихся с символа, который сортируется до ., Это включает в себя некоторые непечатаемые символы, которые, вероятно, не будут присутствовать в данных реального мира, но это также относится к обычной пунктуации, включая ! # $ % & ( ) + -,

Даже если бы это сработало, я бы не стал его рекомендовать, так как использование array_slice делает смысл кода менее понятным.

Вместо того, чтобы пытаться сканировать каталог старыми школами, я настоятельно рекомендую использовать для этого требования SPL Directory Iterator.

Попробуй это:

$iterator = new \DirectoryIterator('/path/to/files');
foreach ($iterator as $file) {
    if($file->isDot()) {
        continue;
    }
    /** Now here you can use lot of SplFileInfo interface methods here */
    // $file->getFilename();
    // $file->isFile();
    // $file->isDir();
    // $file->getSize();
}
Другие вопросы по тегам