IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Parser la sortie de la commande dir


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut Parser la sortie de la commande dir
    Bonjour,
    N'ayant pas accès facilement à la taille de gros fichiers, je souhaite utiliser la commande DIR avec exec pour extraire les informations et les exploiter en php.
    Pour cela j'exécute la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ob_start();
    passthru("DIR \"".$chemin."\"",$statut);
     
    $ligne_commande=ob_get_contents();
    ob_end_clean;
    //convertion du tableau depuis CP850 vers UTF8
    $ligne_commande_tab=explode(PHP_EOL,$ligne_commande);
    Après avoir longuement cherché j'ai vu qu'il était nécessaire de convertir le codage des caractères de $retour depuis le CP850 vers l'UTF8.
    Ensuite j'extrais les informations pour chaque ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    				$date=substr($ligne,0,17);
    				$taille=str_replace(" ","",trim(substr($ligne,17,19)));
    				$fichier=substr($ligne,36);
    J'ai peu d'erreurs mais parfois j'ai un décalage des noms de fichiers et de la taille : il manque un chiffre pour la taille et le nom du fichier parfois inclut les derniers entiers de la taille. Je ne comprends pas pourquoi sachant que la sortie de la commande DOS est toujours présentée avec le même nombre de caractères. De plus je ne parviens pas à supprimer les espaces pour les tailles des fichiers ??

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 091
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 091
    Points : 8 194
    Points
    8 194
    Billets dans le blog
    17
    Par défaut
    filesize() ne te convient pas ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Filesize() retourne une valeur négative pour les taille de fichiers très grandes (php 5.6). Je compte bien migrer mais pas tout de suite...

  4. #4
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Concernant les espaces pour la taille des fichiers j'ai trouvé l'option /-C pour les supprimer :

    Concernant le reste je pense avoir trouvé une solution "presque" définitive en parsant comme ceci :

    utilisation de la fonction exec avec une commande dos convertie au format CP1250.
    Extraction des données sous forme d'un tableau converti au format UTF-8 depuis le format CP850.
    et ensuite j'extrais chaque ligne du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $date=mb_substr($ligne_commande,0,17,"UTF-8");
    $type_taille=str_replace(" ","",trim(mb_substr($ligne_commande,17,19,"UTF-8")));				
    $fichier=mb_substr($ligne_commande,36,NULL);
    Comme ceci j'arrive bien à récupérer tous les fichiers mais j'ai encore une petite erreur pour certains fichiers le symbole € est remplacé par ? lorsque j'enregistre le résultat dans un fichier texte en UTF8...

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2014
    Messages
    253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Avril 2014
    Messages : 253
    Points : 164
    Points
    164
    Par défaut
    Bon j'ai bien avancé mais c'est un peu laborieux et plusieurs choses restent floues.

    Le principe en 2 mots pour ceux que cela intéresse :
    -d'abord pour la commande dos : ajouter les options d'encodage chcp 65001 (UTF8) en premier puis le symbole & et l'option dir /-C.
    -Passer cette commande à la fonction passthru() en récupérant la sortie vers une variable texte
    -extraire les données sous forme d'un tableau

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ob_start();
    passthru("chcp 65001 & DIR /-C \"".$chemin."\"",$statut);
     
    $ligne_commande=ob_get_contents();
    ob_end_clean();
    $ligne_commande_tab=explode(PHP_EOL,$ligne_commande);
    Ensuite pour chaque ligne du tableau, supprimer celles inutiles puis parser chaque ligne sous la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $date=mb_substr($ligne,0,17,"UTF-8");
    $type_taille=str_replace(" ","",trim(mb_substr($ligne,17,19,"UTF-8")));				
    $fichier=mb_substr($ligne,36,NULL);
    A priori il est impossible d'exploiter la sortie de exec ou passtrhu dans un autre codage que le CP850 lorsqu'on manipule des noms de fichiers, d'où l'utilisation de chcp 65001 pour pouvoir lire tous les symboles correctement €,é,°...
    L'utf8 n'est pas le codage par défaut utilisé par certaines fonctions php (fopen, is_file) ce qui oblique parfois à convertir les noms des fichiers utf8 vers l'iso 8859 avec utf8_encode ou autre ... Comment faire pour ouvrir des fichiers avec le nom écrits en utf8 si on ne peut les ouvrir qu'avec leur nom encodé en ISO 8859 1 ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Récupérer la sortie d'une commande
    Par oceeco dans le forum wxPython
    Réponses: 3
    Dernier message: 11/02/2007, 20h37
  2. Parser la sortie de Spamc
    Par Krispy dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 17h32
  3. Trier le résultat d'une commande dir?
    Par Johns dans le forum Langage
    Réponses: 6
    Dernier message: 13/03/2006, 17h24
  4. [MS-DOS] La commande DIR
    Par Furius dans le forum Scripts/Batch
    Réponses: 20
    Dernier message: 25/10/2005, 16h53
  5. [langage] Parser le deroulement d'une commande
    Par roddy dans le forum Langage
    Réponses: 7
    Dernier message: 16/08/2004, 15h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo