Nur neue Datein Kopieren mit fso

hallo,
Ich habe mir ein „Backup tool“ geschrieben welches 6 Ordner von meinem Desktop PC auf mein Laptop kopiert.
Ich benutze:
fso.CopyFolder Quell1, Ziel1, True

Das problem ist nur das bei „True“ alle datein überschrieben werden auch wenn ich nur eine datei von 200 verändert habe. Sobald ich „False“ benutze stopt der Kopiervorgang sobald eine Datei schon vorhanden ist.

ich würde gern die zu kopierenden datein ( auch in unterordnern) vergleichen (anhand des änderungs o. erstellungsdatum.

kann mir jemand weiterhelfen ?

mfg Joe

Hallo Joe,

hilft das?

http://www.wer-weiss-was.de/cgi-bin/forum/showarchiv…

Gruß, Rainer

Danke Rainer,

mit dieser abfrage kann ich 2 Datein vergleichen.
Nun habe ich nurnoch das Problem das ich ca 200 datein (auch in Subfoldern) vergleichen & kopieren muss.

wie kann ich mir alle Datein in einem Ordner & unterordner auflisten und diese einzeln ansprechen?

mfg joe

Hallo,

mit dieser abfrage kann ich 2 Datein vergleichen.
Nun habe ich nurnoch das Problem das ich ca 200 datein (auch
in Subfoldern) vergleichen & kopieren muss.

ja, klar. Ich dachte das hättest Du.

wie kann ich mir alle Datein in einem Ordner & unterordner
auflisten und diese einzeln ansprechen?

So:

Option Explicit

Dim MyFSO
Dim Text
Set MyFSO = CreateObject("Scripting.FileSystemObject")
ScanDir("C:\Bluebyte")
MSGBOX Text 


Sub ScanDir(ScanPfad)
 Dim PathObject, FileObject, FileNow, SubFolders, SubFoldersNow

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

 For Each FileNow In FileObject
 Text = Text + FileNow + VbCrLf
 Next

 Set SubFolders=PathObject.SubFolders
 For Each SubFoldersNow in SubFolders
 ScanDir(SubFoldersNow.ParentFolder+"\"+ SubFoldersNow.Name)
 Next
End Sub

Gruß, Rainer

Danke Rainer !!!
Ich habe noch verständiss probleme:
Da sind die Variablen Filenow & Text.
Um nun einen vergleich zwischen 2 Ordnern zu machen, lese ich beide ein ok aber ich muss ja irgendie „sagen“ das immer die gleichen Dateinamen verglichen werden sollen.
Sinn macht es wohl wenn ich das Quelllaufwerk komplett analysiere und beim einlesen des Ziellaufwerks bei jeder datei frage ob diese mit dem Gleichen zeitstempel vorhanden ist … wenn nicht -> kopieren.

hoffe Du kannst mir nochmal weiterhelfen !

THX mfg JOE

Option Explicit
Dim fso As New FileSystemObject
Dim MyFSO
Dim Text
Dim zugriffx As Folder
Dim sourcex As String
Dim Combox

Sub ScanDir(ScanPfad)
Dim PathObject, FileObject, FileNow, SubFolders, SubFoldersNow
Set PathObject = MyFSO.GetFolder(ScanPfad)
Set FileObject = PathObject.Files

For Each FileNow In FileObject
Text = Text + FileNow + vbCrLf
Combox = Combox + FileNow + CStr(zugriffx.DateLastModified) + vbCrLf

Next

Set SubFolders = PathObject.SubFolders
For Each SubFoldersNow In SubFolders
ScanDir (SubFoldersNow.ParentFolder + „“ + SubFoldersNow.Name)
Next
End Sub

Private Sub Form_Load()
sourcex = „D:\test“
Set MyFSO = CreateObject(„Scripting.FileSystemObject“)
Set zugriffx = fso.GetFolder(sourcex)
ScanDir (sourcex)
MsgBox Text
MsgBox Combox
End Sub

Hallo Joe,

Ich habe noch verständiss probleme:
Da sind die Variablen Filenow & Text.

Filenow wird benötigt, weil die Verzeichnisse Rekursiv durchsucht werden, so kommst Du in die Unterverzeichnisse.

Text dient nur der Anzeige in diesem Beispiel, damit überhaupt etwas passiert. An Deinem Code habe ich gerade gesehen, daß Du VB6 verwendest. Da hätte ich das ohne FSO gemacht, na ja, nun ist’s fast fertig. Mein Code war VBS. :smile:

Um nun einen vergleich zwischen 2 Ordnern zu machen, lese ich
beide ein ok aber ich muss ja irgendie „sagen“ das immer die
gleichen Dateinamen verglichen werden sollen.
Sinn macht es wohl wenn ich das Quelllaufwerk komplett
analysiere und beim einlesen des Ziellaufwerks bei jeder datei
frage ob diese mit dem Gleichen zeitstempel vorhanden ist …
wenn nicht -> kopieren.

Warum willst Du das Ziellaufwerk einlesen? Einfach aus dem Quellpfad den Zielpfad konstruieren und dann erst auf Existenz und dann auf Zeitstempel prüfen. Ich mach’s morgen als VBS fertig, das läuft dann ja auch unter VB6, aber eben bei Bedarf auch ohne. :smile:

Gruß, Rainer

Hi Joe,

nach VB6 ‚umgestrickt‘, fertig. :smile: Mit VB6 ist das alles einfacher.

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

Gruß, Rainer
PS. Tipp: Wenn Du den Artikel abspeicherst, kannst Du aus dem Text den Code leichter kopieren.

Hi Rainer,

Wenn Ich Deinen „code“ testen möchte bekommen ich meldung

„File Not Found“

Der debuger zeigt auf:
Set f2 = MyFSO.GetFile(ZielDatei)

die Ordner habe ich angepasst:

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

habe den Code mehrfach angeschaut,konnte das problem aber nicht finden.

mfg Joe

Hallo Joe,

bitte nicht prügeln, ich habe nicht gründlich genug getestet.

Komischer Weise ist das Programm bei mir durchgelaufen, trotz Fehler im Code.

Die Zeile

If PathFileExists(FileNow) = 0 Then

muß heißen

If PathFileExists(ZielDatei) = 0 Then

dann geht’s.

Sorry,

Gruß, Rainer

Hallo Joe,

ich habe den Fehler im Beitrag darüber korrigiert, falls noch Jemand den Code möchte. Der muß ja nicht das Selbe Problem noch einmal bekommen.

Einverstanden, wenn ich ab da lösche? Das stiftet sonst nur Verwirrung.

Gruß, Rainer

Hallo Rainer,

Danke Deiner Hilfe habe ich nun ein nettes Backup-tool!!

Ich habe nurnoch ein Problem:
Das Programm habe ich auf meinem Privat Laptop geschrieben.
Nur leider kann ich die Exe nicht auf unserem Büro PC ausführen.

Es kommt die Meldung „Disk Not Ready“ Runtime error 71.

kann es sein das kein Net.Framework installiert ist ?
oder gibt es noch andere ursachen ?

mfg joe

Hallo Joe,

Danke Deiner Hilfe habe ich nun ein nettes Backup-tool!!

schön. :smile:

Ich habe nurnoch ein Problem:
Das Programm habe ich auf meinem Privat Laptop geschrieben.
Nur leider kann ich die Exe nicht auf unserem Büro PC
ausführen.

Es kommt die Meldung „Disk Not Ready“ Runtime error 71.

Falscher Pfad? Wenn da ‚D:‘ das CD-Rom-Laufwerk ist und keine CD eingelegt, kommt die Meldung.

kann es sein das kein Net.Framework installiert ist ?
oder gibt es noch andere ursachen ?

.NET-Framework? Nun verrate aber wirklich mal, womit Du programmierst. Ob das Programm mit VB.NET 2005 oder VB2005 läuft, weiß ich nicht, hab’ ich nicht.

Wenn Du das Programm auf einen anderen rechner bringen willst, auf dem die VB-Entwicklungsumgebung nicht installiert ist, mußt Du das Programm installieren und nicht nur die -exe kopieren. Dafür hat VB den 'Verpackungs und Weitergabe Assistent’en. Den mußt Du dazu verwenden, dann läuft das Programm auch auf femden Rechnern.

Gruß, Rainer

Oh man Rainer.DANKE !!!

Jo du hast das Problem ohne es zu sehen erkannt.!!
Auf der Anderen PArtition ist das Cd-Rom nicht E:\ sondern D:\
alles Funktioniert!!

Ich habe noch eins, zwei fragen zur Verbesserung die ich später posten werde.(Wenn der kleine mann schläft :stuck_out_tongue:) und wir gegessenhaben.

Aber nochmals DANKE!!

Hi Joe,

Jo du hast das Problem ohne es zu sehen erkannt.!!

*gg* Admin Erfahrung. :smile: Das passiert in der Firma ständig, bin ich so gewöhnt.

Auf der Anderen PArtition ist das Cd-Rom nicht E:\ sondern D:\
alles Funktioniert!!

Ich habe noch eins, zwei fragen zur Verbesserung die ich
später posten werde.(Wenn der kleine mann schläft :stuck_out_tongue:) und wir
gegessenhaben.

Ja, mach. Ich sehe nachher erst mal ‚wer wird Millionär‘. :smile:

Gruß, Rainer

A hoi,

ich habe eine Konfigurations"Seite" entworfen dort können die Zielverzeichnisse angepasst werden.

Open „E:\test\ziel.x1“ For Output As Zielx1
Print #Zielx1, Label1
Close Zielx1

Open „E:\test\ziel.x2“ For Output As Zielx2
Print #Zielx2, Label2
Close Zielx2

im moment schreibe ich jeden pfad in eine Datei.
ich müsste doch auch alle Zieladdressen in eine Datei schreiben und auslesen können ?

Die Konfigurationsseite ist eine extra exe die ich über eine shell Anweisung öffne

Private Sub Command2_Click()
Shell Pathname:=„E:\test\config.exe“, Windowstyle:=vbNormalFocus
While FindWindow(„E:\test\config.exe“, 0&amp:wink:
DoEvents
Wend
Label19 = „Bereit“
End Sub

wie kann ich eine „Zweite“ Seite in meinem Projekt erstellen ?

mfg joe

Hey Joe, :smile:

ich habe eine Konfigurations"Seite" entworfen dort können die
Zielverzeichnisse angepasst werden.

Open „E:\test\ziel.x1“ For Output As Zielx1
Print #Zielx1, Label1
Close Zielx1

Open „E:\test\ziel.x2“ For Output As Zielx2
Print #Zielx2, Label2
Close Zielx2

Welchen Inhalt hat Zielx1 und Zielx2?

im moment schreibe ich jeden pfad in eine Datei.
ich müsste doch auch alle Zieladdressen in eine Datei
schreiben und auslesen können ?

Kein Problem.

 ff = FreeFile
 Open "E:\test\ziel.txt" For Output As #ff
 Print #ff, Label1.Caption
 Print #ff, Label2.Caption
 Close #ff

So ist das hübscher. :smile:

Die Konfigurationsseite ist eine extra exe die ich über eine
shell Anweisung öffne

Private Sub Command2_Click()
Shell Pathname:=„E:\test\config.exe“,

Config würde ich nicht verwenden. Keine Ahnung, ob Windows das mißversteht, ich riskiere so etwas nicht. Deshalb bevorzuge ich deutsche Bezeichnungen für Dateien und Variablen, da bin ich sicher. :smile:

Windowstyle:=vbNormalFocus
While FindWindow(„E:\test\config.exe“, 0&amp:wink:
DoEvents
Wend
Label19 = „Bereit“
End Sub

Was ist das? Welches VB? Den Code kann ich nicht lesen und men VB auch nicht.

wie kann ich eine „Zweite“ Seite in meinem Projekt erstellen ?

Du meinst eine weitere Form, nehme ich an.
In VB6: Projekt -> Formular einfügen.

Gruß, Rainer

HI Rainer, (heute ist Domino Day :stuck_out_tongue:)
Mit dem code kann ich 6 Variablen in eine Datei Speichern und auslesen ?
irgendwas mache ich da noch falsch.(deshalbt hatte ich vorher für jede variable eine datei genommen :confused:

Dim ff As String
ff = FreeFile
Open „D:\ziel.txt“ For Input As #ff
Print #ff, Ziel1.Caption
Print #ff, Ziel2.Caption
Print #ff, Ziel3.Caption
Print #ff, Ziel4.Caption
Print #ff, Ziel5.Caption
Print #ff, Ziel6.Caption
Close #ff

Dim ff As String
ff = FreeFile
Open „D:\ziel.txt“ For Output As #ff
Print #ff, Ziel1.Caption
Print #ff, Ziel2.Caption
Print #ff, Ziel3.Caption
Print #ff, Ziel4.Caption
Print #ff, Ziel5.Caption
Print #ff, Ziel6.Caption
Close #ff


Ich habe Form2 hinzugefügt:
nun kann ich diese mit visible=true oder False sichtbar/unsichtbar machen , richtig?

Folgenden code habe ich verwendet um eine Meldung zu bekommen wenn die Konfigurationsseite geschlossen wurde um danach die Quellverzeichnisse zu aktuallisieren. ( Ich wusste mir nicht anders zu helfen)

Private Declare Function GetDesktopWindow Lib „user32“ () As Long
Private Declare Function FindWindow Lib „user32“ Alias _
„FindWindowA“ (ByVal lpClassName As Any, ByVal _
lpWindowName As Any) As Long
Private Declare Function PathFileExists Lib „shlwapi.dll“ Alias „PathFileExistsA“ (ByVal pszPath As String) As Long

Private Sub Command2_Click()
Shell Pathname:=„D:\o2Synch\config.exe“, Windowstyle:=vbNormalFocus
While FindWindow(„D:\o2Synch\config.exe“, 0&amp:wink:
DoEvents
Wend
Label19 = „Bereit“
End Sub

Hallo Joe,

HI Rainer, (heute ist Domino Day :stuck_out_tongue:)

ja, nix mit wwM. :frowning:

Mit dem code kann ich 6 Variablen in eine Datei Speichern und
auslesen ?
irgendwas mache ich da noch falsch.(deshalbt hatte ich vorher
für jede variable eine datei genommen :confused:

Ja, …

Dim ff As String

nein, Dim ff as Integer

ff = FreeFile
Open „D:\ziel.txt“ For Input As #ff

Output!

Print #ff, Ziel1.Caption
Print #ff, Ziel2.Caption
Print #ff, Ziel3.Caption
Print #ff, Ziel4.Caption
Print #ff, Ziel5.Caption
Print #ff, Ziel6.Caption
Close #ff

Dim ff As String

Integer

ff = FreeFile
Open „D:\ziel.txt“ For Output As #ff
Print #ff, Ziel1.Caption
Print #ff, Ziel2.Caption
Print #ff, Ziel3.Caption
Print #ff, Ziel4.Caption
Print #ff, Ziel5.Caption
Print #ff, Ziel6.Caption
Close #ff

Sonst richtig.


Ich habe Form2 hinzugefügt:
nun kann ich diese mit visible=true oder False
sichtbar/unsichtbar machen , richtig?

Ja, oder besser mit .Show und .Hide

Folgenden code habe ich verwendet um eine Meldung zu bekommen
wenn die Konfigurationsseite geschlossen wurde um danach die
Quellverzeichnisse zu aktuallisieren. ( Ich wusste mir nicht
anders zu helfen)

Private Declare Function GetDesktopWindow Lib „user32“ () As
Long
Private Declare Function FindWindow Lib „user32“ Alias _
„FindWindowA“ (ByVal lpClassName As Any, ByVal _
lpWindowName As Any) As Long
Private Declare Function PathFileExists Lib
„shlwapi.dll“ Alias „PathFileExistsA“ (ByVal pszPath As
String) As Long

Du willst mit Kanonen auf Spatzen schießen. :smile:

Private Sub Command2_Click()
Shell Pathname:=„D:\o2Synch\config.exe“,
Windowstyle:=vbNormalFocus
While FindWindow(„D:\o2Synch\config.exe“, 0&amp:wink:

Falsche Syntax und falsch eingesetzt. Findwindow liefert Dir das Handle des Fensters. Suchen mußt Du nach der ‚Titelzeile‘, also dem Text, den Du z.B. mit Me.Caption eintragen kannst. Du verwendest dasHandle dann aber nicht (wozu auch) deshalb ist das nutzlos. Das könnte Dir helfen, wenn Du z.B. einen Screenshot von dem Fenster machen wolltest.

DoEvents
Wend
Label19 = „Bereit“
End Sub

Wenn Du das Handle des Fensters haben möchtest, dann schreib Deinen Shell-Befehl mal so:

Wnd = Shell („D:\o2Synch\config.exe“)

dann enthält Wnd das Handle.

Mit GetWindowText (Wnd) [API erst daklarieren] bekommst Du dann den Titel, so lange das Fenster offen ist.

Wozu machst Du das überhaupt in einer anderen .exe? Das habe ich immer noch nicht verstanden. Warum macht das Dein Programm nicht in Form_Load selbst? Dann weißt Du, wann die Daten geschrieben oder gelesen sind.

Erklär mal was die exe macht, was Dein Programm nicht selbst kann und warum es das nicht selbst kann.

Gruß, Rainer

Hallo Joe,

Dim ff As String
ff = FreeFile
Open „D:\ziel.txt“ For Input As #ff
Print #ff, Ziel1.Caption
Print #ff, Ziel2.Caption
Print #ff, Ziel3.Caption
Print #ff, Ziel4.Caption
Print #ff, Ziel5.Caption
Print #ff, Ziel6.Caption
Close #ff

da stört mich noch etwas. Bei mir würde das so aussehen:

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

Steuerelementefelder entlasten den Programmierer und den Computer. :smile:

Gruß, Rainer

hi Rainer,

ö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*

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

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:/

oh man , es ist Freitag und heute stehe ich echt aufm Schlauch…

mfg
joe