Recherche partielle de fichiers

Signaler
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011
-
 sleepless_2101 -
salut
j'aimerais savoir si c'est possible de faire une recherche

partielle de fichiers avec java script exemple : chercher ab*.txt
Merci

27 réponses

Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
Bonjour,

    en javascript.... on parle de fichiers en local donc... sur le micro client !!!

    avec Internet Explorer ( avec les autres navigateurs ça va être
       moins simple, voire impossible pour certains )

        FileSystemObject
ou    CommonDialog

<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Merci encore
J'ai essayer avec [codes/SUPPORTS-REPERTOIRES-FICHIERS-ETJAVASCRIPT_18981.aspx FileSystemObject] mais le probleme est qu'il ne comprend pas le "*"
comme en dos :chercher ab*.jpg;
je coince à ce niveau, je sais chercher tous les fichier avec getfolder(dossier) mais pas une partie
[codes/SUPPORTS-REPERTOIRES-FICHIERS-ETJAVASCRIPT_18981.aspx
]
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
comment tu fais cela ?      je parle du * ?
<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Mais je ne sais pas, je me suis mal exprimé, pardon
justement c'est là où je coince.
la sollution que j'ai trouvé est :
après
function TrouverFichier(dossier)
{
    var f, ff=""
    f = fso.GetFolder(dossier)
    ff = new Enumerator(f.files);
    for(; !ff.atEnd(); ff.moveNext())
    {
        files += ff.item()+"\n";
    }
    return files;   
}
je fait un split sur le files: Fichier=files.split(dossier);
après
if(Fichier[i].substring(1,3).toUpperCase()==AB)  j'affiche
 Mais c'est trèe long

donc je cherche un moyen pour chercher directement que les AB*.txt
et sans les commndialogue
Cordialement
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
déjà traite les au fur et à mesure, dans la boucle...
plutôt que de mémoriser, puis split, puis traitement en fin,
    ça fait une boucle de moins.
<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

je vais essayé et te tiendrai au courant


c’est que des fois j’ai 2000 fichiers



A+
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Voilà, j’ai essayé,

Je gagne une boucle, mais pas beaucoup de temps!! C’est toujours très long

c'est que des fois j'ai 2000 fichiers  
je ne sais pas s'il y a une autre sollution?
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
ça dépend de ce que tu dois faire de ces fichiers.

on pourrait faire excuter un dir ab*.jpg
       et récupérer/traiter la réponse   par exemple
<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Salut,
Oui, normalement c'est que je veux faire, pour créer une liste avec les noms des fichiers
c'est possible?, comment??
peut-être je ne suis pas sur le bon chemin.
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
    var w = new ActiveXObject("WScript.Shell");

    puis
soit tu fais le dir vers un fichier que tu réétudieras
    w.run ('cmd /c dir *.* >txt.tmp');
soit tu choppes directement la réponse
    un exemple, ici
<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Je suis sur la bonne voie, Merci pour le tuyau

une Fois terminer je te tiendrais au courant

Merci encore une autre fois
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
il faudra peut-être aussi regarder comment cette "liste" est faite...
eviter d'utiliser innerHTML par exemple !
<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

je fait le dir:
w.run("%comspec% /c  dir AB*.jpg /B> txt.tmp ",0 );
le 0 pour une execution en arrière plan
après le lit le fichier
apès je fait un split pour recuperer nomfichier
Je fait une liste dynamique,
document.write('<FORM name="XXXX">');
document.write('<SELECT id="select" NAME="Liste" SIZE="10" style="width:80">');
   
    for(var i=0; i<nomdufichier.length; i++)
    {
        var NombreCaractere=NomFichier[i].length;
        var NomAffiche = NomFichier[i].substring(1,NombreCaractere-4);//pour recuperer le nom san extention
      
        
               document.write('<OPTION selected VALUE='+nomdufichier+'>'+ nomdufichier);
              
       }

            document.write('</SELECT></FORM>');   
            window.focus();// pou mettre le focus sur la liste je suis obligé de faire ça
        document.getElementById("select").focus();   
 }

Le problème maintenant est que la liste ne s'affiche pas de suite sauf si je fait un alert()
comme si la fonction lire se passe avant le dir
et quant je fait un alert("toto") ça marche normalement !!!!puisque le declenchement de lire vient après la validation de l'alerte
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
si on était en Visual Basic ( par exemple ), je te dirais
    fait un DoEvents dans la boucle   ;o)
en javascript... il faudrait "ralentir"
    paradoxal n'est-il pas ?
    remplacer la boucle for par un setTimeOut sur u while... par exemple
j'éviterais aussi les document.write ( mais plus par goût qu'autre chose ? )
<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
je ne sais pas si j'ai été clair....

au lieu de

    <select id="sel" size=100>
    </select>
    <script type="text/javascript">
        for ( var n=0;n<1000;n++)
        {    s.length++;
            s.options[s.length-1].text=n;
        }
    </script>

faire :

    <select id="sel" size=100>
    </select>
    <script type="text/javascript">
        function ajout()
        {    if (n<1000)
            {    s.length++;
                s.options[s.length-1].text=n;
                n++;
                setTimeout("ajout();",100);   // 100 ou moins ou plus... !
            }
        }
        var s=document.getElementById("sel");
        n=0;
        ajout();
    </script>

<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Grand Merci
Le probleme n'est pas dans la liste mais dans les fonctions  lancerdir() et lire():

function lancerdir()
{
    var w = new ActiveXObject("WScript.Shell");  
w.run("%comspec% /c  dir AB*.jpg /B> txt.tmp ",0 ); 
            return false;  
//si je met ici un alert("toto") tout va bien si non lire() lit le 1er fichier créer lors de la première recherche: donc il lit le 1er fichier trouvé sans attendre la créeation du nouveau malgrès qu'à chaque fois j'écrase le 1er//
    }

function lire()
{
       
        var fsolire=new ActiveXObject("Scripting.FileSystemObject");
        var ts=fsolire.OpenTextFile("txt.tmp",1,true);
        while (!ts.AtEndOfStream)    // tant que le fichier n'est pas entiérement lu
    {    
            lu=ts.ReadAll();  
        }               
        ts.close();
        NomDuFichier=lu.split("\r");
         
 } 
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Oui, au lieu de alert(), j'ai utilisé une fonction (pas la
mienne) pause:

function pause(time)

    {

       d=new Date();

       diff=0;

        while(diff < time)

        {

          n=new Date();

          diff=n-d;

         }

   }

le problème si le nombre de fichier est grand, le timer est finie avant et on
retombe dans le même problème. Le mieux c'est de trouver comment détecter la
fin de chargement du fichier txt.tmp pour ne démarrer lier() qu'après


Mais comment!?? je ne sais pas si ça éxiste?


Merci.
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
>>  while (!ts.AtEndOfStream)    // tant que le fichier n'est pas entiérement lu
    {      lu=ts.ReadAll();     }               

    readAll lit tout le fichier ! la boucle est inutile.
        utiliser ReadLine();
     ta pause ne donne pas la main au système, et ne libère pas
       le programme, ça ne changera donc rien.
       setTimeout ( ou setInterval ) est la seule solution
          sauf à écrire un ActiveX qui fasse Doevents ( remarque que c'est
            3 lignes de programe ! )

<hr />                Cordialement            Bul         [mon Site]     [M'écrire]
Messages postés
19
Date d'inscription
samedi 3 novembre 2007
Statut
Membre
Dernière intervention
4 décembre 2011

Je vais essayer de trouver ces 3 lignes de programe
qui remplace Doevents  en ActiveX
souhaite moi bonne chance
Merci
Messages postés
13616
Date d'inscription
jeudi 13 février 2003
Statut
Membre
Dernière intervention
15 octobre 2013
34
>>Je vais essayer de trouver ces 3 lignes de programe qui remplace Doevents  en ActiveX
    et pourquoi ne pas utiliser setTimeout ???? ça le fait !

    sinon regarde    exemple ici

    et remplace
Public Sub BeepMessage(Son As Long)

 Dim ret As Long

    ret = MessageBeep(Son)

 End Sub

    par

Public Sub BeepMessage()
   DoEvents()


 End Sub

    modifie l'appel pour ne pas donner le paramètre
       ( modifie les noms si tu veux ... )
    point barre....    mais.... setTimeout, c'est plus simple

<hr />                Cordialement            Bul         [mon Site]     [M'écrire]