VB6 : Cette fonction a besoin d'une correction.. help !

VB6 : Cette fonction a besoin d'une correction.. help ! - VB/VBA/VBS - Programmation

Marsh Posté le 26-04-2002 à 21:37:46    

Sub RecurseTree(CurrentPath$)
    Dim i, n
    Dim FileName$, DirectoryList$()
    FileName$ = Dir(CurrentPath$)
    Do While FileName$ <> ""
        Print #1, CurrentPath$ & FileName$
        FileName$ = Dir
Loop
FileName$ = Dir(CurrentPath$, vbDirectory)
Do While FileName$ <> ""
    If FileName$ <> "." And FileName$ <> ".." Then
        If GetAttr(CurrentPath$ & FileName$) And vbDirectory Then
        n = n + 1
        ReDim Preserve DirectoryList$(n)
        DirectoryList$(n) = CurrentPath$ & FileName$
        End If
    End If
    FileName$ = Dir
    Loop
For i = 1 To n
    RecurseTree DirectoryList$(i) & "\"
Next i
End Sub
 
Je lui passe un path en paramètre, mais à la ligne : If FileName$ <> "." And FileName$ <> ".." Then    , ça plante toujours ! J'ai pourtant prit le code sur le net et il marchait. Là je suis sur winXP et on dirait qu'il ne reconnait pas le répertoire "." et ".." .. quelqu'un aurait une idée ? Par quoi remplacer cela ? Pour tester si le string lu est un rep ?

Reply

Marsh Posté le 26-04-2002 à 21:37:46   

Reply

Marsh Posté le 26-04-2002 à 22:22:54    

Premièrement je dois dire que c un code dégueulasse, déclarer des variables sans type c'est vraiment pas bien  :non: On dirait que la personne qui a codé ca vien du monde de qbasic  :sarcastic:  
 
Puis la fonction fonctione très bien si tu met un "\" à la fin du dossier que tu passe en paramètre ex: RecurseTree ("c:\musique\" )
 
J'ai remis le code en état (:D) et c'est cela que ca donne:

Code :
  1. Sub RecurseTree(CurrentPath As String)
  2.    Dim i as long, n as long
  3.    Dim FileName As String, DirectoryList() As String
  4.    FileName = Dir(CurrentPath)
  5.    Do While FileName <> ""
  6.         Print CurrentPath & FileName
  7.        FileName = Dir
  8.     Loop
  9.     FileName = Dir(CurrentPath, vbDirectory)
  10.     Do While FileName <> ""
  11.         Debug.Print CurrentPath & FileName
  12.             If FileName <> "." And FileName <> ".." Then
  13.                 If GetAttr(CurrentPath & FileName) And vbDirectory Then
  14.                     n = n + 1
  15.                     ReDim Preserve DirectoryList(n)
  16.                     DirectoryList(n) = CurrentPath & FileName
  17.                 End If
  18.             End If
  19.        FileName = Dir
  20.     Loop
  21.     For i = 1 To n
  22.        RecurseTree DirectoryList(i) & "\"
  23.     Next i
  24. End Sub

 

[jfdsdjhfuetppo]--Message édité par Ventilo le 26-04-2002 à 22:23:38--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 26-04-2002 à 23:11:06    

Petite remarque pour faire mon malin : dim FileName$ et dim FileName as String ça revient exactement au même... Le fait de mettre en $ enfin de variable revient à la déclarer de type String.

Reply

Marsh Posté le 27-04-2002 à 07:41:19    

El Scorcho a écrit a écrit :

Petite remarque pour faire mon malin : dim FileName$ et dim FileName as String ça revient exactement au même... Le fait de mettre en $ enfin de variable revient à la déclarer de type String.  




 
Oui mais je trouve ca moin beau :lol: et surtout moin explicit à la déclaration... question de goût je crois  :)

 

[jfdsdjhfuetppo]--Message édité par Ventilo le 27-04-2002 à 07:42:06--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 29-04-2002 à 20:38:37    

Dans un module
---------------------------------
Sub RecurseTree(CurrentPath As String)
  Dim i As Long, n As Long
  Dim FileName As String, DirectoryList() As String
 
  FileName = Dir(CurrentPath)
 
  Do While FileName <> ""
       Write #30, CurrentPath & FileName
      FileName = Dir
   Loop
 
   FileName = Dir(CurrentPath, vbDirectory)
 
   Do While FileName <> ""
       Write #30, CurrentPath & FileName
           If FileName <> "." And FileName <> ".." Then
               If GetAttr(CurrentPath & FileName) And vbDirectory Then
                   n = n + 1
                   ReDim Preserve DirectoryList(n)
                   DirectoryList(n) = CurrentPath & FileName
               End If
           End If
      FileName = Dir
   Loop
 
   For i = 1 To n
      RecurseTree DirectoryList(i) & "\"
   Next i
End Sub
 
 
--------------------------------------
Private Sub Faire_Liste_Click()
Dim StartPath$
StartPath$ = Dir1.Path
Open App.Path & "\" & Text1.Text For Output As #30
RecurseTree StartPath$ '& "\"
Close #30
End Sub
 
---------------------------------------
 
Le prob ? If GetAttr(CurrentPath & FileName) And vbDirectory Then
 
Ca plante toujours ici. : File not found. Quand le GetAttrib(... ) passe sur un dossier, il plante. Que puis-je faire ?! :(

Reply

Marsh Posté le 30-04-2002 à 10:11:27    

si tu changes :
 
 If FileName <> "." And FileName <> ".." Then
 
par :
 
 if StrComp(FileName, ".", vbTextCompare) = 1 and StrComp(FileName, "..", vbTextCompare) = 1 then
 
 
StrComp est plus fiable et 20x fois plus rapide lors de comparaison de chaine (lu sur "VB hardcore" chez Microsoft Press ).

Reply

Marsh Posté le 30-04-2002 à 10:12:18    

Faudrait y mettre un point d'arrêt et voir ce qu'il y a dans  
CurrentPath  FileName et vbDirectory.
 
En C/API Windows, y a un truc pénible (qui se retrouve peut-être en VB) : quand on est dans la racine, on a un répertoire C:\, et quand on est dans un répertoire "profond", l'anti-slash final n'est plus là : C:\TEMP.
 
Si CurrentPath est C:\TEMP et qu'on y colle FileName, ca donne C:\TEMPFileName (bof !). Dans C:\, ça donnerait C:\FileName.
Faut tester le dernier caractère de CurrentPath pour savoir si faut ajouter "\" ou si la longueur de la chaîne CurenPath dépasse 3. Si systématique : C:\\FileName : rebof !!

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed