Ne pas copier les fichiers ou rép existants

Résolu
lmb19 Messages postés 22 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 18 mai 2013 - 28 nov. 2005 à 10:14
ouzzinfall Messages postés 18 Date d'inscription mardi 6 septembre 2005 Statut Membre Dernière intervention 3 mai 2011 - 1 déc. 2005 à 15:45
Bonjour,



J'ai réalisé un petit programme pour copier le contenu d'un répertoire (fichiers+sous-répertoires) cf ci-dessous



quelles lignes de commande dois-je ajouter si je ne veux pas que celui-ci copie les fichiers ou répertoires déjà existants.



merci d'avance

----------------------------------------------------------------------------------

Private Sub Command1_Click()

Dim FichOuRep As String

Dim i As Integer

Dim j As Integer

Dim Tab1() As String

Dim Tab2() As String



x = 0



InitDir = "D:\CEM"

TargetDir = "C:\AA"



If Right(InitDir, 1) <> "" Then InitDir = InitDir & ""

If Right(TargetDir, 1) <> "" Then TargetDir = TargetDir & ""



FichOuRep = Dir(InitDir, vbDirectory + vbArchive)



On Error Resume Next 'problème avec certains fichiers comme pagefile.sys

Do While FichOuRep <> ""

If FichOuRep <> "." And FichOuRep <> ".." Then

If (GetAttr(InitDir & FichOuRep) And vbDirectory) = vbDirectory Then

i = i + 1

ReDim Preserve Tab1(i)

Tab1(i) = FichOuRep

Else

j = j + 1

ReDim Preserve Tab2(j)

Tab2(j) = FichOuRep

End If

End If

FichOuRep = Dir

Loop

On Error GoTo 0



For i = 1 To UBound(Tab1)

ProgressBar1 = (i * 50) / UBound(Tab1)

If FichierExist(TargetDir & Tab1(i) & "") = False Then

MkDir TargetDir & Tab1(i)

End If

If FichierExist(TargetDir & Tab1(i)) = False Then

CopieRep InitDir & Tab1(i), TargetDir & Tab1(i)

End If

Next

For j = 1 To UBound(Tab2)

ProgressBar1 = 50 + ((j * 50) / UBound(Tab2))

If FichierExist(TargetDir & Tab2(j)) = False Then

FileCopy InitDir & Tab2(j), TargetDir & Tab2(j)

x = x + 1

Label1.Caption = x

Label1.Refresh

End If

Next

End Sub

---------------------------------------------------------------------------------------

Private Sub CopieRep(InitDir As String, TargetDir As String)



Dim FichOuRep As String

p = 0

If Right(InitDir, 1) <> "" Then InitDir = InitDir & ""

If Right(TargetDir, 1) <> "" Then TargetDir = TargetDir & ""



FichOuRep = Dir(InitDir, vbDirectory + vbArchive)



Do While FichOuRep <> ""



If FichOuRep <> "." And FichOuRep <> ".." Then

If (GetAttr(InitDir & FichOuRep) And vbDirectory) = vbDirectory Then



MkDir TargetDir & FichOuRep

CopieRep InitDir & FichOuRep, TargetDir & FichOuRep



Else



FileCopy InitDir & FichOuRep, TargetDir & FichOuRep

x = x + 1

Label1.Caption = x

Label1.Refresh



End If

End If



FichOuRep = Dir



Loop

End Sub

12 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
29 nov. 2005 à 13:06
voilà j'ai tout refait.

apparition de nouvelles variables: Attribut et Copie.









Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long



Dim initdir As String

Dim targetdir As String



Private Sub Command1_Click()

Dim i As Integer

Dim j As Integer

Dim Attribut As Long

Dim Path As String

Dim Path1 As String

Dim Path2 As String

Dim FichOuRep As String

Dim Tab1() As String

Dim Source As String

Dim Destination As String

Dim Copie As Boolean



initdir = "D:\CEM"

targetdir = "C:\AA"



i = 1

ReDim Tab1(1): Tab1(1) = ""



While j < i

j = j + 1

Path = Tab1(j)

Path1 = initdir & Path

Path2 = targetdir & Path



If GetFileAttributes(Path2) = -1 Then MkDir Path2



FichOuRep = Dir$(Path1 & "*.*", vbDirectory)



Do While FichOuRep <> ""

If FichOuRep <> "." And FichOuRep <> ".." Then

Source = Path1 & FichOuRep

Attribut = GetAttr(Source)

If Attribut And vbDirectory Then

i = i + 1

ReDim Preserve Tab1(i)


Tab1(i) = Path & FichOuRep & ""

Else


Destination = Path2 & FichOuRep



' si fichier n'existe pas on le copie


If GetFileAttributes(Destination) = -1 Then


Copie = True

Else


' sinon on teste s'il a été modifié ou pas


If Attribut And vbArchive Then


' on le tue d'abord avant de le copier


Kill Destination


Copie = True


End If

End If



If Copie Then


FileCopy Source, Destination


' et enfin on supprime l'Attribut Archive


SetAttr Source, Attribut And 31

End If



End If

End If

FichOuRep = Dir$()

Loop



Wend



End Sub


Daniel
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
28 nov. 2005 à 12:32
il reste à gérer la ProgressBar et les erreurs.

comme je sais pas d'avance combien il va y avoir de fichiers à copier ...

tout le traitement se fait dans une seule boucle.

et une seule Table suffit.







Private Declare Function GetFileAttributes Lib "kernel32" Alias "GetFileAttributesA" (ByVal lpFileName As String) As Long



Dim initdir As String

Dim targetdir As String



Private Sub Command1_Click()

Dim i As Integer

Dim j As Integer

Dim Path As String

Dim Path1 As String

Dim Path2 As String

Dim FichOuRep As String

Dim Tab1() As String



initdir = "D:\CEM"

targetdir = "C:\AA"



i = 1

ReDim Tab1(1): Tab1(1) = ""



While j < i

j = j + 1

Path = Tab1(j)

Path1 = initdir & Path

Path2 = targetdir & Path



If GetFileAttributes(Path2) = -1 Then MkDir Path2



FichOuRep = Dir$(Path1 & "*.*", vbDirectory)



Do While FichOuRep <> ""

If FichOuRep <> "." And FichOuRep <> ".." Then

If (GetAttr(Path1 & FichOuRep) And vbDirectory) = vbDirectory Then

i = i + 1

ReDim Preserve Tab1(i)

Tab1(i) = Path & FichOuRep & ""

Else


If GetFileAttributes(Path2 & FichOuRep) = -1 Then


FileCopy Path1 & FichOuRep, Path2 & FichOuRep

End If

End If

End If

FichOuRep = Dir$()

Loop



Wend



End Sub


Daniel
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
28 nov. 2005 à 13:37
"quelles lignes de commande dois-je ajouter si je ne veux pas que celui-ci copie les fichiers ou répertoires déjà existants."
j'ai seulement vérifier l'existence comme indiqué dans la question.

donc si le fichier a été modifié depuis, il ne sera pas recopié.





il faudrait utiliser l'attribut Archive qui est fait pour ça.

en cas de copie: mettre l'attribut Archive du fichier à copier à zéro

tout changement du fichier repositionnera l'attribut Archive.

ensuite il suffit de tester:

si attribut Archive il faut recopier le fichier même si existe déjà.


Daniel
0
lmb19 Messages postés 22 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 18 mai 2013 1
28 nov. 2005 à 23:11
Bonjour Daniel,



Tout d'abord respect ! J'ai testé ton code, nickel !



Par contre comme tu le dis, si certains fichier sont modifiés, ils ne seront pas recopiés.



j'ai relu plusieurs fois ton explication sur l'ATTRIBUT :" il
faudrait utiliser l'attribut Archive qui est fait pour ça. En cas de
copie: mettre l'attribut Archive du fichier à copier à zéro tout
changement du fichier repositionnera l'attribut Archive.

ensuite il suffit de tester: si attribut Archive il faut recopier le fichier même si existe déjà." mais je n'arrive pas à mettre ça en place.



d'après l'aide Visual Basic, j'ai

vbArchive 32 File has changed since last backup

donc j'utilise la commande : Result = GetAttr(Path2 & FichOuRep) And vbArchive

mais je ne vois pas ce que tu entends par "mettre l'attribut Archive du fichier à copier à zéro tout changement du fichier repositionnera l'attribut Archive"



J'ai donc encore besoin de ton aide

merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
28 nov. 2005 à 23:36
un fichier nouvellement créé a l'attribut Archive (=32)



on teste le Fichier s'il est à copier

source = Path1 & FichOuRep


If GetAttr(source And vbArchive) Then

'le Fichier est à copier (nouveau ou modifié)

Else

'on ne fait rien

End If



s' il existe déjà, on le tue

destination = Path2 & FichOuRep


If GetFileAttributes(destination) <> -1 Then Kill destination



ensuite on le copie

FileCopy source, destination



et enfin on supprime l'Attribut Archive

SetAttr source, 0 ' j'ai ignoré les autres attributs caché, système, read only, ...


si le fichier est ensuite modifié, renommé, l'Attribut Archive sera automatiquement remis par le système.



NB: il reste un problème, les fichiers supprimés sont pas détectés.


Daniel
0
lmb19 Messages postés 22 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 18 mai 2013 1
29 nov. 2005 à 10:12
J'ai mis en place ce que tu m'as expliqué, mais j'ai déjà un problème à la ligne :

If GetAttr(source And vbArchive) Then



j'ai donc remplacé par If (GetAttr(Source) And vbArchive) Then

le code n'a plus d'erreur, mais il ne copie même plus les fichiers que je supprime.



voici le code :



Private Sub Command1_Click()

Dim i As Integer

Dim j As Integer

Dim Path As String

Dim Path1 As String

Dim Path2 As String

Dim FichOuRep As String

Dim Tab1() As String



j = 0

initdir = "D:\CEM"

targetdir = "C:\AA"

i = 1

ReDim Tab1(1): Tab1(1) = ""



While j < i

j = j + 1

Path = Tab1(j)

Path1 = initdir & Path

Path2 = targetdir & Path



If GetFileAttributes(Path2) = -1 Then MkDir Path2



FichOuRep = Dir$(Path1 & "*.*", vbDirectory)



Do While FichOuRep <> ""

If FichOuRep <> "." And FichOuRep <> ".." Then

If (GetAttr(Path1 & FichOuRep) And vbDirectory) = vbDirectory Then

i = i + 1

ReDim Preserve Tab1(i)

Tab1(i) = Path & FichOuRep & ""

Else

'on teste le Fichier s'il est à copier

Source = Path1 & FichOuRep



If (GetAttr(Source) And vbArchive) Then




'le Fichier est à copier (nouveau ou modifié)

's' il existe déjà, on le tue

destination = Path2 & FichOuRep


If GetFileAttributes(destination) <> -1 Then Kill destination



'ensuite on le copie

FileCopy Source, destination



'et enfin on supprime l'Attribut Archive


SetAttr Source, 0 ' j'ai ignoré les autres attributs
caché,système,read only



Else

'on ne fait rien



End If

End If

End If

FichOuRep = Dir$()

Loop



Wend
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
29 nov. 2005 à 13:11
oups !!

il manque la remise à False du Boolean







If Copie Then


FileCopy Source, Destination

' et enfin on supprime l'Attribut Archive


SetAttr Source, Attribut And 31

Copie = False

End If


Daniel
0
lmb19 Messages postés 22 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 18 mai 2013 1
29 nov. 2005 à 20:01
j'ai testé ça fonctionne parfaitement.



Merci encore beaucoup cette aide



A+
0
ouzzinfall Messages postés 18 Date d'inscription mardi 6 septembre 2005 Statut Membre Dernière intervention 3 mai 2011
30 nov. 2005 à 16:53
Salut
j'ai votre discution c'est vraiment passionnent
je vient de débuter le vb6.0
j'aimerai être comme vous.
0
ouzzinfall Messages postés 18 Date d'inscription mardi 6 septembre 2005 Statut Membre Dernière intervention 3 mai 2011
30 nov. 2005 à 16:58
Salut
C'est encore moi
mon probléme je n'arrive pas à ajouter un enregistrement .
je crois savoir que le code d'ajout est:
Privatesub ajout clic
data1.recordset.addnew
end sub

si vous voyez la solution aidez moi cela m permettra de faire comme vous.
0
lmb19 Messages postés 22 Date d'inscription lundi 21 novembre 2005 Statut Membre Dernière intervention 18 mai 2013 1
30 nov. 2005 à 21:33
Hello [auteurdetail.aspx?ID=574540 ouzzinfall],

Je ne vois pas ce que tu entends par enregistrement, car novice en VB que j'utilise surtout sous excel.

J'ai jeté un oeil sur http://vbfrance.com/forum.v2.aspx?ID=66814

si daniel peut t'aider. Ton VB est-il bien installé ?

A+
0
ouzzinfall Messages postés 18 Date d'inscription mardi 6 septembre 2005 Statut Membre Dernière intervention 3 mai 2011
1 déc. 2005 à 15:45
Salut Imb19,
enregistrement c'est à dire ajouter un nouveau article par exemple

codearticle désignation quantite date client

1 onduleur 1 01/12/05 omar
2 Disque dur 3 01/12/05 fatou

je ve gérer mon stock , aprés avoir saisi le premier article que je puisse ajouter un autre .Mai à chaque fois il débogue. Je crois que j'ai bien installer mon vb.

Merci
Mon programme comprend trois tables :
article
client
fournisseur
0
Rejoignez-nous