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

VBScript Discussion :

accès a plusieurs fichiers depuis un objet Scripting.FileSystemObject et optimisation


Sujet :

VBScript

  1. #1
    Membre régulier
    Inscrit en
    Juillet 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 7
    Par défaut accès a plusieurs fichiers depuis un objet Scripting.FileSystemObject et optimisation
    Bonjour,

    J'ai une question concernant l'utilisation d'un seul objet "Scripting.FileSystemObject" pour ouvrir plusieurs fichiers.


    Ma question est la suivante:
    Laquelle des deux méthode est la plus optimisée

    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
     
      Set fso1 = CreateObject("Scripting.FileSystemObject")
     
     
      Set fs1 = fso1.OpenTextFile(OutputFile1, ForWriting,True)
      Set fs2 = fso1.OpenTextFile(OutputFile2, ForWriting,True)
      Set fs3 = fso1.OpenTextFile(OutputFile3, ForWriting,True)
     
      fs1.Writeline "mon texte"
      fs2.WriteLine  "mon texte"
      fs3.WriteLine  "mon texte"
     
      Set fso1 = nothing
      Set fs3 = nothing
      Set fs2 = nothing
      Set fs1 = nothing
    ou bien

    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
    17
    18
    19
     
      Set fso1 = CreateObject("Scripting.FileSystemObject")
      Set fso2 = CreateObject("Scripting.FileSystemObject")
      Set fso3 = CreateObject("Scripting.FileSystemObject")
     
      Set fs1 = fso1.OpenTextFile(OutputFile1, ForWriting,True)
      Set fs2 = fso2.OpenTextFile(OutputFile2, ForWriting,True)
      Set fs3 = fso3.OpenTextFile(OutputFile3, ForWriting,True)
     
      fs1.Writeline "mon texte"
      fs2.WriteLine  "mon texte"
      fs3.WriteLine  "mon texte"
     
      Set fso1 = nothing
      Set fso2 = nothing
      Set fso3 = nothing
      Set fs3 = nothing
      Set fs2 = nothing
      Set fs1 = nothing
    En sachant que les fichiers de sortie peuvent être volumineux


    Merci

  2. #2
    Membre Expert
    Avatar de pc75
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    3 662
    Détails du profil
    Informations personnelles :
    Âge : 70
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2004
    Messages : 3 662
    Par défaut
    Bonjour,

    A priori, je dirai qu'il est inutile (voire pénalisant) de créer plusieurs instances de FileSystemObject.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Réponse: la 1re méthode.

    Aussi il est bon de terminer d'écrire avec fs1.Close.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Par défaut
    Bonsoir,

    Pour les paresseux, plutôt plusieurs instances:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    For i=1 to 3
    CreateObject("Scripting.FileSystemObject").OpenTextFile("OutputFile" & i,2,True).WriteLine "mon texte"
    Next

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Raymix, ton truc ne peux marcher que si la variable "i" fait partie du nom du fichier. En d'autres mots: Ton truc ne marche pas parcequ'entre guillemet doit se trouver le chemin d'accès du fichier et non une variable. Si tu veux utiliser des noms variables avec incrémentation tu dois faire un "Execute" et exécuter le code. Mais ça devient compliqué quand on est novice.

    A la limite on peut insèrer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Execute "oof = OutputFile" & i
    Et utiliser la variable "oof" (ObjOutputFile) dans la formule suivante qui ouvre et écrit dans le fichier.

    Autre erreur: A chaque tour du For...Next tu réinstancies le FileSystemObject. Ce qui est anti-performant. En fait il faut instancié le plus d'objet possible avant le For...Next.

  6. #6
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par Fredledingue Voir le message
    Raymix, ton truc ne peux marcher .....
    non il marche le truc à Raymix... mais bon c'est vrai c'est pas trop "le top" cette création d'un objet FSO à chaque tour de boucle FOR... de plus en décomposant le code en plusieurs ligne c'est plus facile à débugger ...

  7. #7
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Raymix et bbil
    Je vous invite a procèder à l'experience suivante:
    Essayez ces deux codes l'un après l'autre. Le 1er ecrira le texte dans "temp.txt", le second,
    s'il ne fait pas d'erreur ecrira le texte dans un fichier sans extention nomé "OutputFile1".
    Vous verrez ainsi un fichier sans icone apparaitre dans explorer alors que le contenu de "temp.txt" sera inchangé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CreateObject("Scripting.FileSystemObject").OpenTextFile("temp.txt",2,True).WriteLine "mon texte 1"
    MsgBox "ok"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OutputFile1 = "temp.txt"
    i=1
    CreateObject("Scripting.FileSystemObject").OpenTextFile("OutputFile" & i,2,True).WriteLine "mon texte 2"
    MsgBox "ok"

  8. #8
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Citation Envoyé par Fredledingue Voir le message
    Raymix et bbil
    Je vous invite a procèder à l'experience suivante:
    Essayez ces deux codes l'un après l'autre. Le 1er ecrira le texte dans "temp.txt", le second,
    s'il ne fait pas d'erreur ecrira le texte dans un fichier sans extention nomé "OutputFile1".
    Vous verrez ainsi un fichier sans icone apparaitre dans explorer alors que le contenu de "temp.txt" sera inchangé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    CreateObject("Scripting.FileSystemObject").OpenTextFile("temp.txt",2,True).WriteLine "mon texte 1"
    MsgBox "ok"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    OutputFile1 = "temp.txt"
    i=1
    CreateObject("Scripting.FileSystemObject").OpenTextFile("OutputFile" & i,2,True).WriteLine "mon texte 2"
    MsgBox "ok"
    et alors ? dans ton premier code tu écris dans un fichier temp.txt et dans le second ton fichier ce nomme OutputFile ... il est ou le problème ?

    si tu as des problèmes et que tu confond le nom des variables et leur valeur tu devrais penser à rajouter option explicit en haut de tes codes ..

  9. #9
    Membre éclairé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Ce n'est pas moi qui confondait variable et valeurs. C'était Raymix dans son exemple.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 8
    Par défaut
    Bonjour,

    Je decouvre à l'intant que ce sujet agite toujours alors que Breizhpower, qui posait la question semble loin...
    Pour calmer les esprits, effectivement, les noms de fichier issu du code proposé étaient des variables dont l'origine et le
    positionnement n'apparaissait pas dans l'extrait. Pour l'exemple, je les ai pris comme valeurs puisque ce n'était pas le coeur du propos. Autant pour moi...
    Sur l'aspect performances, je suis également d'accord sur le fait que la création de l'objet fso à chaque tour de boucle,
    c'est bof! j'était donc à coté de la question posée. Autant pour moi, bis...
    Toutefois, bien que je reconnaisse beaucoup d'intérêt à vbscript, il faut reconnaître que lorsque l'on recherche la perf à tout prix, ce n'est
    pas forcément par là que ça passe. Par ailleurs, mes collègues developpeurs (ce que je ne suis pas!) me disent régulièrement que
    "plus c'est court, mieux c'est", particulièrement pour debugger!

    Cordialement.

Discussions similaires

  1. Comment récupérer le nom d'un fichier depuis un objet FILE ?
    Par amohr3010 dans le forum Bibliothèque standard
    Réponses: 8
    Dernier message: 05/10/2009, 22h11
  2. Récuperation de chemin d'acces de plusieurs fichiers.
    Par AngeDéchu dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 13/04/2008, 12h22
  3. Réponses: 5
    Dernier message: 03/04/2007, 16h11
  4. Copier plusieurs fichiers depuis MS-ACCESS 2002
    Par Gias Service dans le forum Access
    Réponses: 3
    Dernier message: 21/03/2007, 23h28
  5. Réponses: 6
    Dernier message: 18/05/2006, 09h29

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