Gambas France BETA


Pas de compte ? Incription

Comment recopier un répertoire ?

Ce sujet est résolu.

1
AuteurMessages
Foromus#1 Posté le 15/8/2014 à 09:06:40
Bonjour à tous,

Manque de préparation ou égarement impardonnable, je n'avais pas pensé à la question...
Donc, mon projet dispose d'une liste de répertoires à sauvegarder et une liste de fichiers.
Pas de problème pour les fichiers, la commande Kopy s'en chargera.
Il en va tout autrement pour les répertoires, sachant qu'un répertoire peut contenir plein de choses, comme des sous-répertoires, des sous-sous-repertoires, avec des fichiers un peu partout dans lesdits...
Pour l'instant, je ne vois que la solution de décortiquer mes répertoires d'origine, de créer des sous-répertoires là où je souhaite les copier, et après, les remplir avec les fichiers... Vaste programme comme aurait dit un général fort connu...
Prenons un exemple concret :
J'ai le répertoire X qui contient les sous-repertoires A, B, C. Le B contient les sous-repertoires S1, S2, S3 et aussi les fichiers F1, F2, F3. Quant à S2, il contient les répertoires P1 et P2, etc...
Au départ, j'ai le chemin complet de X, c'est tout. Il va donc falloir que je décortique chaque branche, que je crée chaque sous-repertoire et y colle les éventuels fichiers... J'avoue ne pas vraiment voir la bonne solution, peut-être que la formule donnée dans la discussion sur dirChooser pourrait faire l'affaire et encore...
Bon, j'ai comme la fâcheuse impression que j'ai donné dans un truc nettement au-dessus de mes moyens...
spheris#2 Posté le 15/8/2014 à 11:26:48
Foromus,

1
EXEC["cp","-R","masource","/madestination"]


-R signifi recursif(tout le contenu)

;)
Reivillo#3 Posté le 15/8/2014 à 11:44:07
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Bonjour Foromus & spheris.

J'allais justement proposer ceci:
1
SHELL "cp -R /chemin/de/la/source /chemin/de/la/cible"
Reivillo.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
Foromus#4 Posté le 15/8/2014 à 20:02:17
Bonjour à tous,

Là, j'ai sauté de joie ... et je me suis fait mal en retombant...
J'ai tenté :

1
SHELL "cp -R /chemin/de/la/source /chemin/de/la/cible"


Enfin, pas tout à fait, car je ne dispose, dans mon cas, que de variables, et j'ai donc eu des soucis avec les guillemets.
Mon but, c'est de recopier les fichiers ou répertoires A,B,C,etc, dans le répertoire Z, je les envoie l'un après l'autre, avec une boucle For Next (j'en connais le nombre), à moins qu'il existe en Gambas un équivalent à EoF, ce qui m'éviterait de les compter au chargement.
Donc, avec les variables, ça ne copie rien du tout, en tous les cas, mon fichier de destination est vide.
Ou bien je me suis trompé de fichier, ce qui n'est pas impossible...

Je n'ai pas essayé, par contre le
1
EXEC ["cp", "-R", "masource", "/madestination"]

Faut voir...

Pour ces deux commandes, je me suis toujours demandé quand il fallait utiliser l'une plutôt que l'autre. Dans mes annales, j'avais justement retenu Exec, ce qui me semble d'autant mieux approprié que là, j'ai un exemple avec une variable. Pour cet exemple, J'ouvre un fichier texte, j'ai :

1
EXEC["gedit",Application.Path & "/Journal.txt" FOR READ AS "Process".


Après, l'instruction de copie est peut-être plus simple !


Complément à 22h40 :
Après avoir fait un peu plus attention, il semblerait que ça fonctionne...
Je testerai plus sérieusement demain...
Merci !
Reivillo#5 Posté le 16/8/2014 à 10:30:03
C' est ici, et nul part ailleurs. « Et pis c'est tout ! »Pardon! Foromus.

Je n'ai pas pensé te donner l'Exemple avec des Variables.
Donc le voici. Je pense que ce sera plus Souple...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
PUBLIC SUB Button1_Click()

DIM $sSource AS STRING = "/chemin/de/la/source"
DIM $sCible AS STRING = "/chemin/de/la/cible"

'ATTENTION! bien RESPECTER les ESPACES(Après <-R >, et entre les Chemins.)
SHELL "cp -R " & $sSource & " " & $sCible

'Ou, les Ajouter Automatiquement en Début de Chaîne, avant la Commande < SHELL >.
'$sSource = " " & $sSource
'$sCible = " " & $sCible
'Shell "cp -R" & $sSource & $sCible

END

Ou mieux encore: Dans une Fonction.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
PUBLIC SUB Button1_Click()

DIM $sSource AS STRING = "/chemin/de/la/source"
DIM $sCible AS STRING = "/chemin/de/la/cible"

CopyFileDir($sSource, $sCible)

END

PUBLIC FUNCTION CopyFileDir($sSource AS STRING, $sCible AS STRING)

$sSource = " " & $sSource 'Pour Garantir la Syntaxe,
$sCible = " " & $sCible ' on Ajoute un Espace, devant les Chemins.
SHELL "cp -R" & $sSource & $sCible

END
Reivillo.
Version LinuxMint 13 (1.6.1-1+maya-mate(32-bit)) LTS Noyau 3.14.33-031433-generic (27-02-2015)
LinuxMint 13 Mate Fr ICI, LinuxMint 17 Mate Fr .
Programmation Gambas3 Installé depuis la Console Terminal avec successivement: Les 3 Lignes sudo en Gras ci-dessous...
sudo add-apt-repository ppa:gambas-team/gambas3
sudo apt-get update
sudo apt-get install gambas3 -y
Gambas3.8.4-57.47 (Mise à Jour Auto via mintupdate le 28-01-2016)
Pour la Doc, c'est vers là: Documentation Gambas3 FR
Foromus#6 Posté le 16/8/2014 à 13:52:13
Bonjour à tous,

Donc, je commence à arriver à un résultat concret...

Cela dit, je ne voudrais pas avoir l'air de "passer la brosse à reluire", mais vous êtes quand même des chefs...

Mes ennuis à la suite de l'emploi de Shell ou Exec venaient tout bêtement d'une erreur d'interprétation complétée par une erreur de code... Tant qu'à faire...

Si si, pour les espaces, là, j'ai fait gaffe...

Je vais tester la formule "CopyFileDir($sSource, $sCible)" pour les fichiers. Mais ça me paraît difficile car mes fichiers sont un peu partout, en tous les cas, rarement dans le même répertoire. Pour l'instant, j'utilise Copy, l'ennui, c'est que quand un fichier existe, il se met en erreur, sous le fallacieux prétexte que le fichier existe déjà. Dans mon idée, et comme il s'agit d'une sauvegarde, le but est d'écraser ce qui existait, vu qu'une nouvelle sauvegarde est d'abord destinée à remplacer l'ancienne. J'ai contourné pour l'instant avec une sécurité "If Exist(....)", mais l'inconvénient justement, c'est que ça ne remplace pas. Et ça, ça me gêne. Il faudrait un opérateur supplémentaire à Copy qui permette l'écrasement.
Après, j'ai encore la solution de vider tous les fichiers cibles, tout au moins pour les fichiers, il semble que la question ne se pose pas pour les répertoires.
Edit : Après réflexion, je me dis que c'est idiot mon raisonnement : si mon fichier de destination existe, je l'efface avant de le recopier et le problème est résolu... Mais malgré tout, un "opérateur" supplémentaire à Copy me plairait bien...
J'ai testé la destination externe avec une clé USB, ça a un peu coincé au début, à tel point que j'ai cru ma clé (en FAT 32), complètement HS, mais après une petite pause, c'est revenu en ordre, et les transferts se sont passés correctement. Cela m'a quand même alerté, au point que je n'ose pas tester avec mon disque externe, vu qu'il a des données de sauvegardes (des vraies...), et que je n'ai pas envie de les perdre, même si je peux les retrouver ailleurs.


Voilà, ça avance, ça avance....

Merci grand pour toute l'aide généreuse et précieuse !
linuxos#7 Posté le 16/8/2014 à 16:42:35
Un peu de sel, de poivre et la crevette sera... Bonjour

Pour gérer les éventuels problèmes de carateres bizarre au travers de la commande SHELL, il faut utiliser la commande Quote$

http://www.gambasdoc.org/help/lang/quote?v3

Olivier
Lorsqu'on s'occupe d'informatique, il faut faire comme les canards... Paraître calme en surface et pédaler comme un forcené par en dessous.
1