Position actuelle: Accueil> Derniers articles> FTP_RAWLIST implémente la méthode de tri des listes de fichiers par temps

FTP_RAWLIST implémente la méthode de tri des listes de fichiers par temps

gitbox 2025-05-26

1. Introduction à la fonction ftp_rawlist

La fonction de la fonction ftp_rawlist est d'obtenir des informations détaillées sur les fichiers du répertoire spécifié. Il est similaire à l'exécution de la commande ls -l dans un terminal Linux. Le résultat renvoyé est un tableau de chaînes, chaque élément représente une ligne de détails de fichier, y compris les autorisations, le propriétaire, la taille, le temps, etc.

 $ftp_conn = ftp_connect("gitbox.net");
ftp_login($ftp_conn, "username", "password");
$rawlist = ftp_rawlist($ftp_conn, "/path/to/directory");

Le tableau $ Rawlist obtenu est généralement comme ceci:

 -rw-r--r-- 1 user group 1234 May 10 12:30 file1.txt
drwxr-xr-x 2 user group 4096 Apr 22 10:00 folder1
-rw-r--r-- 1 user group 5678 May 11 14:15 file2.log

2. Analyser les informations de temps et extraire les horodatages

Pour obtenir la commande par le temps, la partie dans chaque fichier doit être analysée et convertie en horodatage. Notez que le format de temps renvoyé par FTP_RAWLIST peut varier en fonction du système d'exploitation du serveur, mais dans la plupart des cas, il est similaire au format ci-dessus.

Voici un exemple de fonction qui analyse les horodatages:

 function parseFtpRawlistTime($line) {
    // Chaînes de ligne divisée par espaces,La plupart des divisions9partie,Empêcher les espaces dans les noms de fichiers
    $parts = preg_split('/\s+/', $line, 9);
    if (count($parts) < 9) {
        return false; // Le format est faux,Impossible d&#39;analyser
    }

    // Les informations sur le temps sont généralement dans le6、7、8Peu,Par exemple:May 10 12:30 ou May 10 2024
    $month = $parts[5];
    $day = $parts[6];
    $timeOrYear = $parts[7];

    // Obtenez l&#39;année en cours,Comme l&#39;année par défaut
    $currentYear = date('Y');

    // Déterminez le format de temps est l&#39;heure:Minute ou année
    if (strpos($timeOrYear, ':') !== false) {
        // Format de temps,Besoin d&#39;épisser l&#39;année en cours
        $datetimeStr = "$month $day $currentYear $timeOrYear";
        $timestamp = strtotime($datetimeStr);
        // Si le temps dépasse l&#39;heure actuelle(Nouvel An),Ajusté à l&#39;année dernière
        if ($timestamp > time()) {
            $timestamp = strtotime("$month $day " . ($currentYear - 1) . " $timeOrYear");
        }
    } else {
        // C&#39;est le format de l&#39;année,Conversion directe
        $datetimeStr = "$month $day $timeOrYear";
        $timestamp = strtotime($datetimeStr);
    }

    return $timestamp ?: false;
}

3. Triez la liste des fichiers à l'heure

Avec l'horodatage, nous pouvons trier l'intégralité de la liste de fichiers en combinaison avec la fonction USORT de PHP. Les exemples sont les suivants:

 // Hypothèses $rawlist Oui ftp_rawlist Le tableau retourné
usort($rawlist, function($a, $b) {
    $timeA = parseFtpRawlistTime($a);
    $timeB = parseFtpRawlistTime($b);

    if ($timeA == $timeB) return 0;
    return ($timeA < $timeB) ? -1 : 1;
});

De cette façon, $ Rawlist est trié par ordre croissant de temps. Si vous voulez trier par ordre décroissant, tournez simplement les symboles de comparaison à l'envers.

4. Exemple de code complet

En combinant la fonction précédente du temps d'analyse, ce qui suit est un exemple d'une liste complète de fichiers FTP triés par le temps:

 <?php
$ftp_server = "gitbox.net";
$ftp_user = "username";
$ftp_pass = "password";

$conn = ftp_connect($ftp_server);
if (!$conn) {
    die("Impossible de se connecter à FTP serveur");
}

if (!ftp_login($conn, $ftp_user, $ftp_pass)) {
    ftp_close($conn);
    die("FTP La connexion a échoué");
}

$path = "/path/to/directory";
$rawlist = ftp_rawlist($conn, $path);
ftp_close($conn);

function parseFtpRawlistTime($line) {
    $parts = preg_split('/\s+/', $line, 9);
    if (count($parts) < 9) {
        return false;
    }

    $month = $parts[5];
    $day = $parts[6];
    $timeOrYear = $parts[7];
    $currentYear = date('Y');

    if (strpos($timeOrYear, ':') !== false) {
        $datetimeStr = "$month $day $currentYear $timeOrYear";
        $timestamp = strtotime($datetimeStr);
        if ($timestamp > time()) {
            $timestamp = strtotime("$month $day " . ($currentYear - 1) . " $timeOrYear");
        }
    } else {
        $datetimeStr = "$month $day $timeOrYear";
        $timestamp = strtotime($datetimeStr);
    }

    return $timestamp ?: false;
}

usort($rawlist, function($a, $b) {
    $timeA = parseFtpRawlistTime($a);
    $timeB = parseFtpRawlistTime($b);
    if ($timeA == $timeB) return 0;
    return ($timeA < $timeB) ? -1 : 1;
});

// Liste de fichiers triée de sortie
foreach ($rawlist as $line) {
    echo $line . "\n";
}