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

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 37
    Points : 29
    Points
    29

    Par défaut Accès au nom du fichier dans fs.readFile

    Bonjour,

    Je cherche à réutiliser le nom du fichier retourné dans l'événement d'un fs.readFile().

    Dans le code ci-dessous, la trace m'indique toujours le nom du dernier fichier pour la variable file...
    Savez-vous pourquoi ? Et comment corriger le problème ?

    Mon objectif est de scanner un répertoire, de récupérer des données dans les fichiers trouvés et d'écrire ces données et le nom du fichier dans un nouveau fichier.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var fs = require('fs');
    var path = require('path');
     
    var dir = path.join(__dirname, 'files');
     
    fs.readdir(dir, function(err, items) {
      if (err) throw err;
      for (var i=0; i<items.length; i++) {
        var file = path.join(dir, items[i]);
     
        fs.readFile(file, 'utf8', function(err, data) {
          if (err) throw err;
          console.log(path.basename(file));
        });
      }
    });
    Pour un dossier contenant : file1.txt, file2.txt et file3.txt
    La trace sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    file3.txt
    file3.txt
    file3.txt
    Merci pour votre aide.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    juin 2010
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : juin 2010
    Messages : 2 954
    Points : 6 391
    Points
    6 391

    Par défaut

    La solution la plus simple est d’utiliser let ou const à la place de var.

    L’explication est que var ne crée pas de portée spécifique à la boucle for.
    Pour chaque appel à ta fonction de rappel function(err, items) { ... } il ne se crée qu’une seule fermeture (closure), et donc il n’y a qu’une seule version des variables i et file pour toutes les itérations de la boucle for. C’est un peu le même problème qu’exposé dans la FAQ Comment attribuer à des objets un onclick faisant appel à une variable de boucle ?

    D’autres explications sur la page MDN de let. (const a les mêmes règles de portée que let.)
    La FAQ JavaScript – Les cours JavaScript
    Touche F12 = la console → l’outil indispensable pour développer en JavaScript !

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    décembre 2013
    Messages
    37
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : décembre 2013
    Messages : 37
    Points : 29
    Points
    29

    Par défaut

    Super ! Merci pour ces infos Watilin !

    Cette version fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    var fs = require('fs');
    var path = require('path');
     
    const dir = path.join(__dirname, 'files');
     
    fs.readdir(dir, function(err, items) {
      if (err) throw err;
      for (let i=0; i<items.length; i++) {
        let file = path.join(dir, items[i]);
     
        fs.readFile(file, 'utf8', function(err, data) {
          if (err) throw err;
          console.log(path.basename(file));
        });
      }
    });

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

Discussions similaires

  1. stocker les nom de fichiers dans une base
    Par Corben dans le forum Windows
    Réponses: 2
    Dernier message: 04/01/2006, 15h50
  2. Upload et enregistrement du nom du fichier dans une bdd
    Par johan_barbier dans le forum XMLRAD
    Réponses: 8
    Dernier message: 26/09/2005, 12h02
  3. rechercher d'un nom de fichier dans un répertoire
    Par yerome dans le forum Langage
    Réponses: 7
    Dernier message: 21/07/2005, 11h54
  4. Mettre le nom du fichier dans TextEdit ?? Avec CFileDialog
    Par P'tit Troll dans le forum Windows
    Réponses: 2
    Dernier message: 19/04/2005, 17h32
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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