Безопасно ли использовать 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();
}