Gambas France BETA


Pas de compte ? Incription

Revenir sur copies multiples

1
AuteurMessages
Foromus#1 Posté le 30/5/2018 à 19:24:29
Bonjour à tous,

Il y a pas mal de temps, j'avais posté ici, suite à des soucis de copies sur un projet de "copies de secours". Les opérations se déroulent normalement (ça marche bien), et le processus affiche une barre de progrès qui se remplit régulièrement.
J'ai mis du temps à comprendre pourquoi mes copies étaient altérées ou incomplètes. En fait, bien que la barre soit complète et que l'affichage de l'opération indique que "tout s'est passé avec succès", il se trouve que, non, tout ne s'est pas passé avec succès parce que, en réalité, le processus de copie n'est pas du tout terminé, même si mon logiciel indique que s'est fini. Et effectivement, si je laisse du temps au temps - je vais faire autre chose entre-deux pendant un quart d'heure ou une heure (suivant le support), les copies sont effectuées normalement. Maintenant que je le sais, j'en tiens compte, mais ça fait désordre...
Donc, mon idée, c'est de quantifier le poids des fichiers à recopier, sachant qu'il y a, d'une part, des fichiers seuls, d'autre part, des répertoires - éventuellement des sous-répertoires, avec des fichiers dedans. Une fois le volume déterminé par calcul, je lance la copie, et à chaque copie, je note et ajoute le poids de chaque fichier copié dans une variable. Je commande ma "progress-bar", d'une valeur max = poids de l'ensemble calculé au départ, j'utilise la valeur de la variable susdite pour l'affichage, et ne permettrai la fin des opérations que lorsque les deux poids seront égaux. Au passage, cela montrera aussi que la copie a été exacte.
Au fond, ça doit marcher à peu près comme ça dans le cas d'un transfert de fichier via le gestionnaire de l'OS où, là, on a vraiment un affichage en temps réel.
Pour réaliser mon idée, il faudrait que je connaisse la formule me permettant de connaître le poids d'un fichier, ça, je ne sais pas faire... Ensuite, comment je m'en sors avec les sous-répertoires ?
Certes, je pourrais me passer de cette amélioration, mais je serais content de faire un truc un peu plus performant...
didier18#2 Posté le 31/5/2018 à 12:24:51
Bonjour Foromus

il faudrait que je connaisse la formule me permettant de connaître le poids d'un fichier

Regarde l'aide de la fonction "stat", je pense que cela répondra à ta question, en plus il y a quelques exemples que tu pourras adapter à ton besoin...

Pour connaitre le nombre de fichiers du répertoire "parent" et des répertoires "enfant" colle l'exemple ci-dessous dans un nouveau projet...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
' Gambas class file

PUBLIC idir AS INTEGER 'nombre de répertoires
PUBLIC ifile AS INTEGER 'nombre de fichiers
PUBLIC ifiletotal AS INTEGER 'nombre de fichier total (y compris dans les sous répertoires)
PUBLIC sfile AS STRING 'nom du fichier
PUBLIC spath AS STRING = "/mnt/home" 'répertoire parent à examiner...
PUBLIC spathdirname AS STRING 'chemin du répertoire nommé utilisé pour la récursivité

PUBLIC SUB Form_Open()

FOR EACH sfile IN Dir(spath, "*", gb.File) 'pour chaque fichiers contenu dans le répertoire
INC ifile 'incrémente le nbr de fichiers (ifile déterminera l'avance du progressbartext)
NEXT 'passe au fichier suivant

PRINT "Il y a " & ifile & " fichiers dans le répertoire " spat 'affiche le nombre de fichiers dans la console
PRINT

FOR EACH spathdirname IN RDir(spath, "*", gb.Directory) 'pour chaque sous répertoire du répertoire principal
INC idir 'incrémente idir (idir contient le nbre de répertoires qu'il faudra examiner)
ifile = 0 'initialise ifile
FOR EACH sfile IN Dir(spath & "/" & spathdirname, "*", gb.File) 'pour chaque fichiers contenu dans spathdirname
INC ifile 'incrémente le nbr de fichiers (nbfic détermine l'avance du progressbartext)
NEXT 'passe au fichier suivant
PRINT "Il y a " & ifile & " fichiers dans " & spathdirname 'affiche le nombre de fichiers dans la console
ifiletotal += ifile 'ajoute le nombre de fichiers trouvés à ifiletotal
NEXT 'passe au répertoire suivant
PRINT
PRINT spath & " contient " & idir & " répertoires qui contiennent " ifiletota " fichiers."

END


En changeant "/mnt/home" par un autre chemin/répertoire, tu pourras voir le contenu complet du répertoire...
Tout est affiché dans la console, il te suffira de récupérer les valeurs des variables selon ton besoin.

EDIT lors de la copie du code, des caractères ont disparus ???
16 Print "Il y a " & ifile & " fichiers dans le répertoire " & spath 'affiche le nombre de fichiers dans la console
29 Print spath & " contient " & idir & " répertoires qui contiennent " & ifiletotal & " fichiers."

Bonne journée.
spheris#3 Posté le 31/5/2018 à 19:52:40
Foromus,
Personnellement pour faire des copies de secours ou sauvegarde sans passer par gambas. J'utilise plutôt ce script sh qui marche impec :

Il te faut juste créer un fichier dans le home de ton PC et de le rendre exécutable.

Voici le script :

#!/bin/bash
REPERTOIRE_SOURCE="/home/"
REPERTOIRE_DESTINATION="/media/mondisquedurexterne"

# Détecter la présence du volume de destination et interrompre l'opération si nécessaire
if [ ! -e "$REPERTOIRE_DESTINATION" ]
then
echo "Attention, le disque de sauvegarde n'est pas présent"
exit
fi

rsync -av $REPERTOIRE_SOURCE "$REPERTOIRE_DESTINATION"

echo "La commande de sauvegarde a terminé son travail..."
echo "Vérifiez dans le terminal s'il n'y a pas eu d'erreur !"
read


;)
Foromus#4 Posté le 1/6/2018 à 06:27:32
Bonjour à tous,

Merci pour ces conseils et documentation.
D'abord, merci à didier18, je vais étudier un peu la question, la commande "stat", je découvre...
Spheris :
Il y a des dizaines d'applications de sauvegardes qui existent déjà et que je n'ai pas spécialement testé cependant, alors pourquoi vouloir faire un truc qui ne servira qu'à moi ? Réponse : me faire plaisir... (Profondément égoïste, je reconnais...).
Concernant les scripts sh, je n'ai jamais approfondi la question, pensant que c'était trop loin de mon niveau, peut-être aussi que j'en n'ai jamais trouvé la nécessité, ou que ladite nécessité ne me soit point, d'emblée, apparue. Il est probable que je me prive là d'une source probablement bien intéressante, mais, concrètement, peut-on vouloir tout connaître ?.. Je crois qu'il faut parfois oser borner ses limites même si une limite, par définition, n'a d'intérêt que si elle est franchie...
Bon, mais je vais réfléchir à tout ça...
1