OVH Cloud OVH Cloud

Traitement récursif de répertoires

16 réponses
Avatar
Gloops
Bonjour tout le monde,

Aujourd'hui je ne "fais" pas vraiment "dans" l'innovation, puisque je me
suis retrouvé face à des programmes de sauvegarde qui manquaient de
mémoire tantôt l'un, tantôt l'autre, sans que personne ne réussisse à
trouver une explication.

J'ai donc écrit mon propre joujou.

J'avais d'abord pensé parcourir un répertoire par Dir(), mais Dir a du
mal à être récursif : quand on liste un sous-répertoire, une fois qu'on
revient au répertoire ascendant, Dir retourne une erreur.

Il aurait donc fallu créer un tableau de chaînes pour chaque répertoire,
parcourir le répertoire trois fois, une fois pour dimensionner le
tableau, une fois pour le renseigner, et une fois pour traiter les
sous-répertoires. En ne sachant pas dans l'absolu combien on aura de
répertoires à traiter. Ou alors utiliser des tableaux dynamiques, ça
marche bien, ça, dans ce cas ?

Finalement je me suis simplifié l'existence, j'ai utilisé
FileSystemObject. ça fait l'objet de critiques, fso utilise beaucoup de
ressources, mais question récursivité, aucun souci il me semble.

Et justement, mon développement sur le traitement le plus basique et
universel qui soit, était motivé par le fait que les commandes standard
(XCOPY, Robocopy) ... manquaient de ressources. Pour XCOPY : traitement
interrompu, mémoire insuffisante. Pour Robocopy : même pas besoin d'en
dire autant. On copie normalement pendant cinq secondes, poussivement
pendant les cinq secondes suivantes, et ensuite il ne se passe plus
rien, les témoins des disques sont éteints, on attend que l'utilisateur
interrompe le traitement par le gestionnaire des tâches. Et fso s'en est
très bien sorti de ce point de vue.


J'ai donc quelque chose du style

Public Sub GereRepertoire(ByVal Rep As Folder)
Set objSousReps = Rep.SubFolders
For Each Fic in Rep.Files
GereFichier Fic
Next
For Each SR in objSousReps
GereRepertoire fso.GetFolder(SR.path)
Next
End Sub

ça fait peut-être un peu lourd fso.GetFolder(SR.path) pour retourner SR,
je ne me rappelle plus trop mais je pense que si j'ai fait comme ça
c'est que je devais avoir un message d'erreur autrement.

Quelque chose que j'apprécie bien c'est que ça va jusqu'au bout sans se
planter, ni me dire qu'on manque de mémoire.

Mais là, me voilà pris d'un doute : j'ai cherché un fichier, et j'ai dû
aller le prendre sur la source, il n'avait pas été copié.

Je me suis dit qu'il avait dû y avoir une erreur que j'avais oubliée,
ben non, le fichier n'est pas inscrit dans le compte-rendu de sauvegarde.

Quelque chose me dit quand même que si mon algorithme était complètement
délirant il en manquerait plus que ça.

La vérification désoriente un peu d'ailleurs, car l'explorateur trie
obligatoirement les fichiers, alors que For Each file in, les retourne
apparemment dans l'ordre de la création. Enfin ça c'est anecdotique.


Il y aura une recherche d'un outil de vérification, pour comparer la
source et la cible, mais la question qui relève de ce newsgroup serait
surtout la suivante : y a-t-il une grossière erreur dans ma démarche ?

Avec la procédure que j'ai indiquée ci-dessus, peut-on s'attendre à ce
que GereFichier ne soit pas appelé pour tous les fichiers ?

6 réponses

1 2
Avatar
Gloops
ça tombe bien, chez moi ça a bien été transcrit par deux doubles points.
____________________
Clive Lumb a écrit :
Note:
Dans mon post ci-dessus, les lignes du fichier bat qui commencent avec ">>"
devrait commencer par deux fois ":"
C'est mon lecteur de news qui a pris les "::" pour des quotes

Afficher le résultat


call notepad "%LogLoc%"
Goto :EOF






Avatar
Gloops
Clive Lumb a écrit :



D'abord j'utilise la version 10 de Robocopy, tu pourras le télécharger avec
la doc ici:
http://clumb.free.fr/robocopy.zip



Ah, ben voilà une bonne réponse !
ça fait tout drôle de poser une question dans un newsgroup et d'avoir la
réponse dans un autre. Je n'avais pas choisi le bon finalement. :)


La ligne de commande (en fichier bat) "kivabien" pour moi est reproduit en
fin de post

On peut utiliser l'option /IPG:n où "n" est un delai en millisecondes entre
paquets de 64k - si ton disque/système a des problèmes pour suivre cela
pourrait être utile.



Qui sait, ça peut aider.
J'ai vu que l'application VB met un peu de temps à rendre le contrôle
quand elle copie des gros fichiers, quand on a une autre application
gourmande ça la freine. Avec cette option ça devrait être plus "fluent".


Toutefois Xcopy et Robocopy utilisent les fonctions de base de Windows pour
copier les fichiers - en consequence ils devraient être très très fiables et
devraient gèrer les erreurs, disques lents etc. sans le moindre problème. Si
tu as des problèmes de manque de memoire/plantage il faut soupçonner un
problème ailleurs. Outre des histoires de driver, chipset ide etc. déjà
évoquées, je me demande si ce n'est pas un autre programme qui tourne qui
pourrait être la source du problème.
- Tu n'auras pas quelquechose qui regarde l'usage des fichiers comme filemon
ou diskmon de Sysinternals ?
- Ton anti-virus aussi pourrait "exploser" si tu fait trop d'actions disque
pour lui (je parle des AVALC - "anti-virus à la con" tels que NOD), essayer
de désactiver le scan en temps réel pendant la copie.
- Service indexation activé sur le disque destination ? Cela pourrait poser
un problème.
- Disque USB et modem ADSL USB sur la même interface ?
- Disque USB 2.5" auto-alimenté par l'USB ?
- Chipset VIA ancienne génération ?



Effectivement, j'ai l'indexation active, plus l'AVALC fourni avec la
machine pour trois mois (il est systématiquement installé sur les
machines neuves, sinon avec tout le mal qu'on dit de lui ils n'auraient
peut-être pas beaucoup de clients ; du coup je laisse McAfee sur
l'ancienne machine, ça me laisse le temps de voir venir).

C'est vrai que c'est un AVALC comme tu dis, puisqu'il m'oblige à
désactiver le lancement du logiciel de paramétrage de la carte vidéo,
sinon depuis une certaine mise à jour la touche Windows ne peut pas être
rémanente (et sur ce coup-là je n'ai pas été très méfiant, le vendeur
m'a décrit l'engin, qui était en stock dans l'entrepôt à côté, j'ai dit
allons-y, ça fait que je n'ai pas regardé le clavier avant d'acheter, or
c'est le point faible de Toshiba -ils m'ont casé la touche Windows dans
le coin en haut à droite, donc son caractère rémanent est obligatoire
sauf si on a une deuxième paire de mains).

Pendant un temps j'arrivais à m'en sortir avec la restauration système,
et puis un jour les points de restauration ont tous disparu à la fois
sans préavis. Il va bien falloir que je trouve le temps d'installer Ghost.

Pour ce qui est de la carte mère je ne saurais dire, je n'ai pas encore
installé Everest, et je suis un peu largué dans MSINFO32. Enfin la
catégorie "périphériques à problème" est vide, c'est au moins déjà ça
d'encourageant. ça aurait été épatant d'avoir une machine qui démarre si
bien, qui lance les programmes si vite (avec juste un hic sur les
sauvegardes), avec plein de périphériques à problème.

La connexion ADSL se fait par port Ethernet. Wanadoo m'avait proposé un
modem USB, mais quand je m'en suis rendu compte je l'ai vite échangé,
car les ports USB on n'en a jamais trop, alors que le port Ethernet on
n'a guère autre chose à en faire. C'est vrai que la "raie manta" est un
peu plus encombrante et a de moins jolies petites lupiotes, m'enfin d'un
point de vue pratique ...

Les disques externes ont leur alimentation propre. J'en ai un (parti en
révision d'ailleurs) qui pourrait s'alimenter sur port USB sur une
machine qui supporterait, mais en général je branche l'alimentation.


Voilà

Clive



:: Lancer le bat à partir du disque DESTINATION
::Il trouvera tout seul la lettre de ce disque



Je regarde ça un de ces quatre. En attendant, il y a l'imprimante qui
attend que je m'occupe d'elle depuis quelques jours, et plein plein de
courrier qui traîne.


Merci pour ces tuyaux.
Avatar
Gloops
Gloops a écrit :
C'est vrai que c'est un AVALC comme tu dis, puisqu'il m'oblige à
désactiver le lancement du logiciel de paramétrage de la carte vidéo,
sinon depuis une certaine mise à jour la touche Windows ne peut pas être
rémanente (et sur ce coup-là je n'ai pas été très méfiant, le vendeur
m'a décrit l'engin, qui était en stock dans l'entrepôt à côté, j'ai dit
allons-y, ça fait que je n'ai pas regardé le clavier avant d'acheter, or
c'est le point faible de Toshiba -ils m'ont casé la touche Windows dans
le coin en haut à droite, donc son caractère rémanent est obligatoire
sauf si on a une deuxième paire de mains).



Pour ce problème je n'ai pas encore fait remonter l'info. Triste à dire,
mais il va falloir débourser du surtaxé pour savoir si je suis le seul,
histoire de savoir si c'est à moi de prévenir Norton et ATI, ou au SAV
de la machine.
Avatar
Gloops
Au fait, je n'ai pas percuté tout de suite, mais hier soir j'ai fait une
sauvegarde avec XCOPY, et c'est passé comme une lettre à la poste (enfin
sauf pour modifier, je vais mettre un mot dans le newsgroup windowsxp).

Comme je disais par ailleurs, il semblait y avoir un conflit entre
l'antivirus et le programme de configuration de la carte vidéo.
Peut-être le fait de désactiver un des deux a-t-il, en plus de permettre
la touche Windows rémanente, solutionné ce problème de mémoire pour les
sauvegardes.

C'est très empirique comme approche, mais pour le moment je n'en ai pas
d'autre.
Avatar
Fred
Dans : news:,
Gloops disait :
Euh, si tu pouvais me le refaire au ralenti, ça serait sympa :)



Ce que bayosky veut dire, c'est qu'il y a un objet folder dans Scripting
et un autre dans VB.

Public Sub GereRepertoire(ByVal Rep As Scripting.Folder)
Dim SR as Scripting.Folder
Dim Fic as Scripting.File

For Each Fic in Rep.Files
GereFichier Fic
Next
For Each SR in Rep.SubFolders
GereRepertoire SR
Next
End Sub



--
Fred
http://www.cerbermail.com/?3kA6ftaCvT
Avatar
Gloops
Ah, voilà qui est effectivement bon à savoir.

Honnêtement, ça m'était carrément "passé au-dessus".

______________
Fred a écrit :
Dans : news:,
Gloops disait :
Euh, si tu pouvais me le refaire au ralenti, ça serait sympa :)



Ce que bayosky veut dire, c'est qu'il y a un objet folder dans Scripting
et un autre dans VB.

Public Sub GereRepertoire(ByVal Rep As Scripting.Folder)
Dim SR as Scripting.Folder
Dim Fic as Scripting.File

For Each Fic in Rep.Files
GereFichier Fic
Next
For Each SR in Rep.SubFolders
GereRepertoire SR
Next
End Sub





1 2