Nur neue Datein Kopieren mit fso

hi Rainer,

muss Ich ‚Ziel‘ auch deklarieren ? und wie ?

ich bekomme die Meldung Variable not Defined

Hallo Joe,

öhm, die exe wurde soeben in Form2 übertragen…
ich wusste nicht das es sooo einfach ist eine zweite Form für
die Konfiguration der Quellordner zu erstellen *hust*

OK, so ist es einfacher und wir müssen uns nicht mit den Handles herumschlagen. Das wäre zwar gegangen, aber Du hättest dann nichts mehr verstanden.

Ich habe es erstma mit Form2.Visible=True bzw beim Ende button
False gelöst werde es aber nochmal mit show & Hide testen.

Ach ist egal, lass es so. :smile:

Probleme habe ich immernoch mit:

Dim Ziel1, Ziel2, Ziel3, Ziel4, Ziel5, Ziel6 As String
'zum testen
Ziel1 = „test“
Ziel2 = „test“
Ziel3 = „test“
Ziel4 = „test“
Ziel5 = „test“
Ziel6 = „test“

Dim ff As Integer
Dim i As Integer

ff = FreeFile

Open „D:\ziel.txt“ For Output As #ff
For i = LBound(Ziel) To UBound(Ziel)
Print #ff, Ziel(i).Caption
Next
Close #ff

musses nicht heißen
For i = LBound(Ziel1) To UBound(Ziel6) ?
geht aber auch nicht:/

Ach, Ziel1 - n sind Variablen, ich dachte, das wären schon Deine Labels. Egal am Code ändert das nichts.

Das soll dann bei Dir so aussehen:

Dim Ziel(1 to 6) As String
'zum testen
Ziel(1) = „test“
Ziel(2) = „test“
Ziel(3) = „test“
Ziel(4) = „test“
Ziel(5) = „test“
Ziel(6) = „test“

oder besser

For i = 1 To 6
Ziel(i) = „test“
Next

oder noch besser

For i = LBound(Zeil) To UBound(Ziel)
Ziel(i) = „test“
Next

Das macht das Selbe, ist aber felxibler. Fügst Du etwas hinzu, mußt Du den Code nicht ändern, kannst keine Änderung vergessen.

Gruß, Rainer

hi Rainer,

Ist das richtig das ich nun Variablen die in beiden Formen benutzt werden GLobal deklariere ?

gn8 bis morgen.

und immer wieder mit capslock THX!!

Hallo Joe,

Ist das richtig das ich nun Variablen die in beiden Formen
benutzt werden GLobal deklariere ?

Ja, ‚Public‘ in einem Modul.

Gruß, Rainer

Moin Rainer,

hier kommen neusten fragen :confused:
Ich habe einen Statusbalken der nach jedem Kopierten Ordner steigt:
Ich würde aber auch gern nach jedem Ordner ein fertig ausgeben , also label13 & label 14 zum Beispiel.
Diese erscheinen aber erst wenn alle Kopiervorgänge abgeschlossen sind, gleichzeitig. Warum ?

Quelle = Quell1
Ziel = Ziel1
ScanDir (Quelle)
ProgressBar1.Value = ProgressBar1.Value + 15
Label13 = „Fertig“

Quelle = Quell2
Ziel = Ziel2
ScanDir (Quelle)
ProgressBar1.Value = ProgressBar1.Value + 15
Label14 = „Fertig“

Das zweite frage:
Ich habe Form1 und Form2
in Form 1 habe ich nachdem die Quellen aus der Datei gelesen wurden:

Label7 = Ziel1
Label8 = Ziel2
Label9 = Ziel3
Label10 = Ziel4
Label11 = Ziel5
Label12 = Ziel6

Wenn nun aber in Form2 die Ziele verändert werden, ändern sich aber die Label in Form1 nicht. Die Variablen sind die gleichen Public.
kann ich mein schliessen von Form2 irgendwie ein refresh durchführen ? auf die Label in FOrm1 ?

Danke,mfg joe

Moin Rainer,

Das mit der Aktuallisierung in der Form1 funktioniert nun.
Form1.Label8 = Label8 …

Ich probiere noch etwas rum und melde mich wieder:stuck_out_tongue:

mfg joe

Moin Rainer,

Mein Programm scheint etwas CPU lastig zu sein :stuck_out_tongue:
bzw. wenn ich ein backup starte, ein explorer fenster öffne und danachw wieder auf das BAckup " switche" baut sich das fenster nur schleppend oder erst nach beendingung das Backups wieder ganz auf :confused:

gibt es das eine „einfache“ lösung ?

mfg joe

Hallo Joe,

Mein Programm scheint etwas CPU lastig zu sein :stuck_out_tongue:
bzw. wenn ich ein backup starte, ein explorer fenster öffne
und danachw wieder auf das BAckup " switche" baut sich das
fenster nur schleppend oder erst nach beendingung das Backups
wieder ganz auf :confused:

Ja, das ist bei allen VB-Programmen so, die ziehen immer die maximale Rechenleisung. Wenn das Programm in einer Schleife länger zu tun hat, hast Du diesen Effekt immer.

gibt es das eine „einfache“ lösung ?

Ja, gibt es. Halte das Programm so oft wie möglich, in der ‚innersten‘ Schleife jeweils für ein paar Millisekunden an.

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Aufruf mit Sleep 50 hält das Programm für 50 Millisekunden an.
Das Programm wird davon ein wenig langsamer, aber der Prozessor wird deutlich entlastet.

Gruß, Rainer

Moin schön,
…mal wieder eine frage.

im mom synchronisiere ich 6 Ordner, nacheinander.
4 Verzeichnisse werden komplett analysiert und alle Änderungen werden übertragen…

bei 2 Ordnern würde ich gern nur die daten der letzten 3 MOnate vergleichen & kopieren und nicht alle.
Ich vermute das ich ein extra „Sub“ für diesen prozess anlegen muss oder?

Kann ich den inhalt von der "Sub ScanDir(Scanpfad)
einfach in eine andere Sub kopieren ? zb Sub scandirdate(scanpfad) ?
Wie sieht die prüfung aus ? also Aktuelles datum = date, Create date > 90 days …oder hmmm

Sub ScanDir(ScanPfad)
Dim PathObject, FileObject, FileNow, SubFolders, SubFoldersNow, f1, dt1, f2, dt2, dd
Dim ZielPfad As String
Dim ZielDatei

Set PathObject = MyFSO.GetFolder(ScanPfad)
Set FileObject = PathObject.Files

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) - Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Else
Set f1 = MyFSO.GetFile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.GetFile(ZielDatei)
dt2 = f2.DateLastModified
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
FileCopy FileNow, ZielDatei
End If
End If
End If
Next

Set SubFolders = PathObject.SubFolders
For Each SubFoldersNow In SubFolders
ZielPfad = Ziel + „“ + Right(SubFoldersNow, Len(SubFoldersNow) - Len(Quelle) - 1)
If PathFileExists(ZielPfad) = 0 Then
MkDir ZielPfad
End If
ScanDir (SubFoldersNow.ParentFolder + „“ + SubFoldersNow.Name)
Next
End Sub

Hallo Joe,

im mom synchronisiere ich 6 Ordner, nacheinander.
4 Verzeichnisse werden komplett analysiert und alle Änderungen
werden übertragen…

OK.

bei 2 Ordnern würde ich gern nur die daten der letzten 3
MOnate vergleichen & kopieren und nicht alle.

Hmmm. Das Alter erfährst Du doch erst, wenn Du die einzelne Datei ansiehst. Nur junge Dateien prüfen geht IMHO nicht.

Ich vermute das ich ein extra „Sub“ für diesen prozess anlegen
muss oder?

Kann ich den inhalt von der "Sub ScanDir(Scanpfad)
einfach in eine andere Sub kopieren ? zb Sub
scandirdate(scanpfad) ?

Klar kannst Du eine neue Sub anlegen und da etwas ähnliches machen wie in der Ersten. Muß halt nur anders heißen. ‚Kopieren1‘ und ‚Kopieren2‘ oder ähnlich.

Wie sieht die prüfung aus ? also Aktuelles datum = date,
Create date > 90 days …oder hmmm

??? Kopiert werden doch ohnehin nur Dateien, die verändert sind. Du willst erst das Datum der Erstellung der Datei prüfen und wenn die älter als 90 Tage ist, brauchen weitere Veränderungen nicht mehr gesichert werden? Verstehe ich das richtig?

Dein Code ist im Moment sehr schwer lesbar. Kannst Du bitte beim posten von Code den pre - Tag verwenden?

Gruß, Rainer

Moin,

Mal als Beispiel, Ich habe ein frisch bespieltes Notebook und möchte nun die ganzen Ordner Syncen. Da es bei 2 Ordnern um Pläne geht wo mir die in den letzten 3 monaten reichen und ich nicht die letzten 2 Jahre kopieren möchte, muss ich da noch einen Filter basteln.

Wenn ich Form1 nach jedem Kopiervorgang refreshen will einfach
Form1.refresh oder wie war der befehl ?

(habe leider gerade kein VB zu hand.

Option Explicit

Private Declare Function PathFileExists Lib „shlwapi.dll“ Alias „PathFileExistsA“ (ByVal pszPath As String) As Long

Dim MyFSO
Dim Quelle As String
Dim Ziel As String

Sub ScanDir(ScanPfad)
Dim PathObject, FileObject, FileNow, SubFolders, SubFoldersNow, f1, dt1, f2, dt2, dd
Dim ZielPfad As String
Dim ZielDatei

Set PathObject = MyFSO.getFolder(ScanPfad)
Set FileObject = PathObject.Files

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) - Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Else
Set f1 = MyFSO.getfile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.getfile(ZielDatei)
dt2 = f2.DateLastModified
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
FileCopy FileNow, ZielDatei
End If
End If
End If
Next

Set SubFolders = PathObject.SubFolders
For Each SubFoldersNow In SubFolders
ZielPfad = Ziel + „“ + Right(SubFoldersNow, Len(SubFoldersNow) - Len(Quelle) - 1)
If PathFileExists(ZielPfad) = 0 Then
MkDir ZielPfad
End If
ScanDir (SubFoldersNow.ParentFolder + „“ + SubFoldersNow.Name)
Next
End Sub

Private Sub Command1_Click()
Set MyFSO = CreateObject(„Scripting.FileSystemObject“)
Quelle = „C:\edi“
Ziel = „C:\Test“
ScanDir (Quelle)
Command1.Caption = „Fertig“
End Sub

Hallo Joe,

Mal als Beispiel, Ich habe ein frisch bespieltes Notebook und
möchte nun die ganzen Ordner Syncen. Da es bei 2 Ordnern um
Pläne geht wo mir die in den letzten 3 monaten reichen und ich
nicht die letzten 2 Jahre kopieren möchte, muss ich da noch
einen Filter basteln.

Ich schreib’s mal aus dem Hut in Deinen Code, ich bin am falschen Arbeitsplatz, hier habe ich kein VB.

Wenn ich Form1 nach jedem Kopiervorgang refreshen will einfach
Form1.refresh oder wie war der befehl ?

Ja. Wozu? Printest Du auf die Form?

Option Explicit

Private Declare Function PathFileExists Lib „shlwapi.dll“
Alias „PathFileExistsA“ (ByVal pszPath As String) As Long

Dim MyFSO
Dim Quelle As String
Dim Ziel As String

Sub ScanDir(ScanPfad)
Dim PathObject, FileObject, FileNow, SubFolders,
SubFoldersNow, f1, dt1, f2, dt2, dd
Dim ZielPfad As String
Dim ZielDatei

Set PathObject = MyFSO.getFolder(ScanPfad)
Set FileObject = PathObject.Files

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) -
Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Else
Set f1 = MyFSO.getfile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.getfile(ZielDatei)
dt2 = f2.DateLastModified

dt3 = f1.Date… ??? Erstellungsadatum??? Kann nicht nachsehen, wie das heißt

If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then

If Datediff ( „ww“, dt3, Date)

Juhu,

Sobald ich ein anderes Fenster über den Kopiervorgang schiebe und wieder schliesse wird aus meinem tool eine „weiße“ oberfläche. Das einzige was lesbar wird ist der Statusbalken wenn er sich verändert.
Deswegen dachte ich an Form1.refresh. Reicht das nicht ?

Bei dem Kopiervorgang eben hatte ich das problem das eine Quelldatei auf meinem Rechner geöffnet war :confused: der komplette kopiervorgang wurde abgebrochen ohne diese auszulassen. Wie gesagt habe ich im mom auch nur die Exe hier ohne das VB Projekt :confused:

ich melde mich später wieder.

Hallo Joe,

Sobald ich ein anderes Fenster über den Kopiervorgang schiebe
und wieder schliesse wird aus meinem tool eine „weiße“
oberfläche. Das einzige was lesbar wird ist der Statusbalken
wenn er sich verändert.
Deswegen dachte ich an Form1.refresh. Reicht das nicht ?

Doch, reicht. Ein DoEvents reicht aber auch.

Bei dem Kopiervorgang eben hatte ich das problem das eine
Quelldatei auf meinem Rechner geöffnet war :confused: der komplette
kopiervorgang wurde abgebrochen ohne diese auszulassen.

Wenn das Programm erst mal fehlerfrei läuft, kannst Du ja dafür ein ‚On Error Goto‘ einbauen.

Wie
gesagt habe ich im mom auch nur die Exe hier ohne das VB
Projekt :confused:

ich melde mich später wieder.

OK, ich werde mich vermutlich erst am Abend melden.

Gruß, Rainer

Hallo Rainer,

Das Programm „rennt“:stuck_out_tongue:

bis auf die Geschichte mit der geöffneten Datei :confused:
zu dem ‚On Error Goto‘.Also ausgeschrieben würde beim Fehler die datei zu lesen, diese einfach auslassen. Nur das jetzt wieder in meinen QuellCode einzubauen … goto next File :stuck_out_tongue:

bis später

Sobald ich ein anderes Fenster über den Kopiervorgang schiebe
und wieder schliesse wird aus meinem tool eine „weiße“
oberfläche. Das einzige was lesbar wird ist der Statusbalken
wenn er sich verändert.
Deswegen dachte ich an Form1.refresh. Reicht das nicht ?

Doch, reicht. Ein DoEvents reicht aber auch.

Bei dem Kopiervorgang eben hatte ich das problem das eine
Quelldatei auf meinem Rechner geöffnet war :confused: der komplette
kopiervorgang wurde abgebrochen ohne diese auszulassen.

Wenn das Programm erst mal fehlerfrei läuft, kannst Du ja
dafür ein ‚On Error Goto‘ einbauen.

Wie
gesagt habe ich im mom auch nur die Exe hier ohne das VB
Projekt :confused:

ich melde mich später wieder.

OK, ich werde mich vermutlich erst am Abend melden.

Gruß, Rainer

Hi,

Das Programm „rennt“:stuck_out_tongue:

Fein! :smile:

bis auf die Geschichte mit der geöffneten Datei :confused:
zu dem ‚On Error Goto‘.Also ausgeschrieben würde beim Fehler
die datei zu lesen, diese einfach auslassen. Nur das jetzt
wieder in meinen QuellCode einzubauen … goto next File :stuck_out_tongue:

ich habe den Code gerade mal überflogen, da genügt schon ein ‚On Error Resume Next‘ vor den Kopierbefehl, danach kommt ja nichts, wes dann nicht klappt.

Gruß, Rainer

Moin,
habe das On Error Resume Next genau vor dem Kopierbefehl geschrieben.
Werde das morgen mal testen.

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) - Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Else
Set f1 = MyFSO.GetFile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.GetFile(ZielDatei)
dt2 = f2.DateLastModified
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
'test
On Error Resume Next
FileCopy FileNow, ZielDatei
End If
End If
End If
Next


Was macht „DoEvents“ ? wie baue ich es in den Code ?
einfach alleine reinschreiben ?


Wo finde ich hier die Angabe, das die Files nicht älter als 3 Monate sein dürfen ?
dt3 = f1.DateCreated
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
If DateDiff(„ww“, dt3, Date) dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
If DateDiff(„ww“, dt3, Date)

Hallo Joe,

habe das On Error Resume Next genau vor dem Kopierbefehl
geschrieben.
Werde das morgen mal testen.

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) -
Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Else
Set f1 = MyFSO.GetFile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.GetFile(ZielDatei)
dt2 = f2.DateLastModified
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
'test
On Error Resume Next
FileCopy FileNow, ZielDatei
End If
End If
End If
Next

Ja, das hat zu klappen. :smile:


Was macht „DoEvents“ ? wie baue ich es in den Code ?
einfach alleine reinschreiben ?

Schreib’s einfach so hin, wo Du willst, am Besten so, daß es möglichst oft abgearbeitet wird.

Was Ereignisse (Events) sind, weißt Du ja. Der Befehl verzweigt das Programm an den Eventhandler und gibt dem Computer die Möglichkeit, zwischendurch mal etwas anderes zu machen, bevor das Programm an der selben Stelle fortgesetzt wird. So kannst Du z.B. auch ein Programm abbrechen, ohne DoEvents hängt es im Code fest und Du müßtest schon den Task abschießen um das Programm zu beenden.


Wo finde ich hier die Angabe, das die Files nicht älter als 3
Monate sein dürfen ?
dt3 = f1.DateCreated
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
If DateDiff(„ww“, dt3, Date)

Einstellung Beschreibung
yyyy Jahr
q Quartal
m Monat
y Tag des Jahres
d Tag
w Wochentag
ww Woche
h Stunde
n Minute
s Sekunde

On Error Resume Next
FileCopy FileNow, ZielDatei

hier der complette quelltext.

Sub ScanDir2(ScanPfad)
Dim PathObject, FileObject, FileNow, SubFolders,
SubFoldersNow, f1, dt1, f2, dt2, dd
Dim ZielPfad As String
Dim ZielDatei

Set PathObject = MyFSO.GetFolder(ScanPfad)
Set FileObject = PathObject.Files

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) -
Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Else
Set f1 = MyFSO.GetFile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.GetFile(ZielDatei)
dt2 = f2.DateLastModified
dt3 = f1.DateCreated
If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
If DateDiff(„ww“, dt3, Date)

Nabend, da bin ich wieder…

da war dieses Problem das ich Ordner nur vergleichen und andere Ordner nur vergleichen bzw Kopieren wenn sie nicht älter als 4 Wochen sind.

mit DateM sage ich welche der beiden Varianten benutzt werden soll
Wenn DateM 0 ist vergleichen u kopieren
wenn DateM nicht 0 ist „Else“ nur files die nicht älter als 4 wochen sind.

doch irgendwo hat sich ein fehler eingeschlichen … aber wo ?
Das Programm arbeitet doch die prüfung mit dem erstellungsdatum scheint nicht zu funktionieren…

For Each FileNow In FileObject
ZielDatei = Ziel + „“ + Right(FileNow, Len(FileNow) - Len(Quelle) - 1)
If PathFileExists(ZielDatei) = 0 Then
FileCopy FileNow, ZielDatei
Form1.Refresh
DoEvents
Else
If DateM = 0 Then
Set f1 = MyFSO.GetFile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.GetFile(ZielDatei)
dt2 = f2.DateLastModified

If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
On Error Resume Next
FileCopy FileNow, ZielDatei
End If
End If

Else
Set f1 = MyFSO.GetFile(FileNow)
dt1 = f1.DateLastModified
Set f2 = MyFSO.GetFile(ZielDatei)
dt2 = f2.DateLastModified
dt3 = f1.DateCreated

If dt1 dt2 Then
If DateDiff(„s“, dt2, dt1) > 0 Then
If DateDiff(„ww“, dt3, Date) > 4 Then
On Error Resume Next
FileCopy FileNow, ZielDatei
End If
End If
End If
End If
End If
Next

Hallo Joe,

doch irgendwo hat sich ein fehler eingeschlichen … aber wo
?
Das Programm arbeitet doch die prüfung mit dem
erstellungsdatum scheint nicht zu funktionieren…

*gg* Ich glaube, ich habe es gefunden. :smile: Du hast Größer geschrieben, wo Du kleiner meinst.

Hole die Informationen über die Quelldatei
Schreibe in dt1 das letzte Änderungsdatum der Quelldatei
Hole die Informationen über die Zieldatei
(… löst das nicht einen Fehler aus, wenn die Datei noch nicht existiert? Da würde ich erst die Existenz prüfen.)
Schreibe in dt2 das letzte Änderungsdatum der Zieldatei
Schreibe in dt3 wann die Quelldatei erstellt wurde

Prüfe als erstes, ob Quell- und Zieldatei identisch sind. Wenn ja, gibt es nichts zu tun.
Prüfe dann, ob die Quelldatei älter als vier Wochen ist. Wenn ja, kopiere die Datei, jüngere Dateien müssen nicht kopiert werden. :smile:

Gruß, Rainer