Сканировать только текстовые файлы функцией Scandir в PHP

Сканировать только текстовые файлы функцией Scandir в PHP

от автора

в

Вы когда-нибудь сталкивались с задачей, когда нужно было просканировать директорию и найти только текстовые файлы? Это может быть полезно для множества задач: от простого поиска до сложного анализа данных. Сегодня мы рассмотрим, как можно использовать функцию scandir в PHP для сканирования директории и фильтрации только текстовых файлов. Если вы уже сталкивались с подобными задачами, эта статья поможет вам решить их более эффективно.

Scandir

Функция scandir в PHP используется для получения списка файлов и директорий в указанной директории. Она проста в использовании и идеально подходит для базовых операций по работе с файловой системой. Но как сделать так, чтобы scandir возвращала только текстовые файлы? Об этом мы и поговорим.

Пример использования Scandir

Начнем с простого примера использования функции scandir. Допустим, у нас есть директория files, в которой находятся разные файлы.

<?php
$directory = 'files';
$files = scandir($directory);

print_r($files);
?>

Этот код выведет массив всех файлов и директорий в files. Однако нам нужно сделать так, чтобы выводились только текстовые файлы. Дял этого нужно применить фильтрацию.

Фильтрация файлов по типу

Чтобы отфильтровать только текстовые файлы, нужно проверить расширение каждого файла. В PHP это можно делать с помощью функции pathinfo, которая возвращает информацию о пути к афйлу. Добавим фильтрацию в наш код:

<?php
$directory = 'files';
$files = scandir($directory);

$textFiles = [];

foreach ($files as $file) {
    if (is_file($directory . '/' . $file) && pathinfo($file, PATHINFO_EXTENSION) === 'txt') {
        $textFiles[] = $file;
    }
}

print_r($textFiles);
?>

Теперь в массиве $textFiles будут только файлы с расширением .txt. Это простой, но эффективный способ фильтрации.

Более сложные сценарии: работа с поддиректориями

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

<?php
function scanDirectory($directory) {
    $files = scandir($directory);
    $textFiles = [];

    foreach ($files as $file) {
        if ($file === '.' || $file === '..') {
            continue;
        }

        $fullPath = $directory . '/' . $file;
        if (is_dir($fullPath)) {
            $textFiles = array_merge($textFiles, scanDirectory($fullPath));
        } else {
            if (pathinfo($file, PATHINFO_EXTENSION) === 'txt') {
                $textFiles[] = $fullPath;
            }
        }
    }

    return $textFiles;
}

$directory = 'files';
$textFiles = scanDirectory($directory);

print_r($textFiles);
?>

В этом примере функция scanDirectory сканирует указанную директорию и все ее поддиректории, собирая пути ко всем текстовым файлам.

Дополнительные проверки: MIME-тип

Иногда расширения файлов могут вводить в заблуждение. Например, файл с расширением .log также может быть текстовым. Чтобы убедиться, что файл действительно является текстовым, можно использовать функцию mime_content_type.

<?php
function scanDirectory($directory) {
    $files = scandir($directory);
    $textFiles = [];

    foreach ($files as $file) {
        if ($file === '.' || $file === '..') {
            continue;
        }

        $fullPath = $directory . '/' . $file;
        if (is_dir($fullPath)) {
            $textFiles = array_merge($textFiles, scanDirectory($fullPath));
        } else {
            $mimeType = mime_content_type($fullPath);
            if (strpos($mimeType, 'text') !== false) {
                $textFiles[] = $fullPath;
            }
        }
    }

    return $textFiles;
}

$directory = 'files';
$textFiles = scanDirectory($directory);

print_r($textFiles);
?>

Теперь мы проверяем MIME-тип файла, чтобы удостовериться, что это действительно текстовый файл.

Практическое применение

Почему все это важно? Давайте рассмотрим несколько реальных примеров.

Поиск логов

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

Обработка данных

Представьте, что вы разработчик, работающий над проектом, где нужно анализировать текстовые данные, разбросанные по разным директориям. Использование scandir и фильтрации по MIME-типу позволит вам быстро собрать необходимые данные для дальнейшей обработки.


Автор статьи:

Обновлено:

30.05.2024


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *