Ordner vergleichen. FSO

Moin,

Ich Synchronisiere 2 Ordner anhand des Änderungsdatum der Files darin.
Nun habe ich das Problem das der zu überprüfende Ordner 5GB gross ist und bis dort alle Datein über das Netzwerk verglichen wurden vergehen je nach Natzwerklast mal schnell 30 min.

Deshalb würde ich gern eine Vorprüfung machen die wie folgt aussieht:
Ich würde gern beim start der Synchronisation das Änderunsdatum des zu Synchronisierenden Ordners Speichern und beim nächsten mal einfach prüfen ob sich das Datum mit dem von mir Gespeicherten Datum unterscheidet oder ob es noch gleich ist.

Somit könnte ich gleich sagen das keine Datein verglichen werden müssen da es keine Änderungen gibt.

Wie müsste sowas aussehen?

Danke, Mfg joe

Moin,
um nochmal zu verdeutlich was ich eigentlich will versuche ich mich hier mal am Freestyle coden…

If ModifyDate(Ziel1) Date1 then
scandir 'starte prüfung.
Else
MSGBOX „Es gibt keine neue daten“
End if

hmmm ist es das schon gewesen ? scandir ist eine vorhandene Funktion.

mfgjoe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Joe,

ich kopiere Dir mal einen Codeschnipsel aus dem Script56.chm (Findest Du bei Microsoft).

Function ZeigeDateizugriffsinfo(dateiAngabe)
 Dim fso, f, s
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.GetFile(dateiAngabe)
 s = UCase(dateiAngabe) & "
"
 s = s & "Erstellt: " & f.DateCreated & "
"
 s = s & "Letzter Zugriff: " & f.DateLastAccessed & "
"
 s = s & "Letzte Änderung: " & f.DateLastModified
 ZeigeDateizugriffsinfo = s
End Function

In ein VB-Programm eingebaut sieht das dann so aus:

'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*
'\* Auf der Form liegen: \*
'\* Eine Textbox, Muliline = True \*
'\* Ein Command-Button \*
'\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*

Option Explicit

Private Sub Command1\_Click()
 Dim fso, f, s
 Set fso = CreateObject("Scripting.FileSystemObject")
 Set f = fso.GetFolder("C:\Programme")
 s = UCase("C:\Programme") & vbCrLf
 s = s & "Erstellt: " & f.DateCreated & vbCrLf
 s = s & "Letzter Zugriff: " & f.DateLastAccessed & vbCrLf
 s = s & "Letzte Änderung: " & f.DateLastModified
 Text1.Text = s
End Sub

War es das, was Du wolltest?

Gruß, Rainer

Danke Rainer,
ich war mit meinem ForumPost etwas voreilig habe das Problem der Datumprüfung von einer Fso seite. habe aber noch ein anderes Problem:

Mal ein Beispiel:
Ich schaue ob das Änderungsdatum eines Ordners mit dem von mir in einer Datei gespeicherten Datum übereinstimmt. Wenn nicht wird dieser Synchronisiert. Soweit ist alles bestens, da ich mir so die 30 min datein vergleichen des 5GB Ordners spare wenn es gar keine Änderung gibt.
Der zu überprüfende Ordner ist C:\derOrdner in diesem gibt es 4 weitere Ordner: Ordner1-Ordner4 und in jedem gibt es wiederum ca 50 Ordner.

Meine Code Prüft aber nur den Hauptordner „DerOrdner“, wenn hier also erkannt wird das sich darin was verändert hat werden die ganzen 5GB verglichen. Ich würde aber gern eine Prüfung haben die nach meiner Prüfung noch 2 Ordner tiefer schaut. Also Wenn es eine Änderung gibt werden Ordner1-Ordner4 mit dem gespeicherten Datum geprüft und nur in dem Ordner mit der Änderung wird der nächste Ordner gesucht welcher verändert wurde.

DAs Problem könnte aber sein das zb in Ordner1 / unterorder1 1Minute früher als unterorder10 geschrieben wurde also passt mein Datum vom Hauptordner nicht mehr … ich merke selbst das ich mich irgendwie im kreis drehe.

Kann ich mit FSO evtl eine ganze Liste der Unterorder + Änderungsdatum speicher und anhand der Liste den Veränderte Ordner finden ohne das ich alle Files vergleichen muss ??

HILFE :stuck_out_tongue:

Danke mfg Joe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

wenn Du in einem Pfad die Unterordner mit durchsuchen willst, geht das am Besten mit einer rekursiven Funktion, d.h. die Funktion ruft sich selbst auf. (Auch der Code ist von Microsoft, ich habe ihn nur angepasst.)

Option Explicit

Dim MyFSO
Dim Text

Private Sub Command1\_Click()
 Set MyFSO = CreateObject("Scripting.FileSystemObject")
 ScanDir ("C:\Programme")
End Sub

Sub ScanDir(ScanPfad)
 Dim PathObject, SubFolders, SubFoldersNow

 Set PathObject = MyFSO.getFolder(ScanPfad)

 Set SubFolders = PathObject.SubFolders
 For Each SubFoldersNow In SubFolders
 List1.AddItem (SubFoldersNow.ParentFolder + "\" + SubFoldersNow.Name) \_
 & " Erstellt: " & SubFoldersNow.DateCreated \_
 & " Letzter Zugriff: " & SubFoldersNow.DateLastAccessed \_
 & " Letzte Änderung: " & SubFoldersNow.DateLastModified
 ScanDir (SubFoldersNow.ParentFolder + "\" + SubFoldersNow.Name)
 Next
End Sub

Gruß, Rainer

Hallo Rainer,

ich hatte auch gesucht, aber wusste ich ja gar nicht richtig nach was ich suchen sollte :confused: Also erstma Danke.

Nun kann ich einen Kompletten Ordner mit Unterordner Scannen und mir zu jedem das „ÄnderungsDatum“ Ausgeben lassen.

Wenn mein tool nun den ganzen ORdner Kopiert hat müsste ich alle
„ÄnderungsDaten“ der Ordner in eine Datei schreiben um beim nächsten mal prüfen zu können.

Also müsste ich nach dem Scan die Datei füllen
Ich habe in der For Schleife Folgende Variablen

Folderx = (SubFoldersNow.ParentFolder + „“ + SubFoldersNow.Name)
Datex = (SubFoldersNow.DateLastModified)

Dabei habe ich Probleme mit folgenden Code.
Wie muss es aussehen wenn ich nun bei jedem durchlauf die beiden Variablen Fortlaufend in die Datei schreiben möchte ?
Wo gebe ich den Datei Pfad an ? Der Pfad muss in der na Variable stehen oder ?

Dim ff As Integer
ff = FreeFile
Dim wert As String, n As Integer
Open na For Input As #ff
While Not EOF(ff)
Line Input #ff, wert
Check1(n).Value = Val(wert)
n = n + 1
Wend
Close #ff

Und jetzt kommt der brocken.
Ich starte mein Synchtool erneut öffne die Datei und prüfe nun welcher Ordner auf dem Server des Datum in Der Datei :confused:
Naja erste speichern. Danke bis später / früher

mfg joe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Nun kann ich einen Kompletten Ordner mit Unterordner Scannen
und mir zu jedem das „ÄnderungsDatum“ Ausgeben lassen.

Wenn mein tool nun den ganzen ORdner Kopiert hat müsste ich
alle
„ÄnderungsDaten“ der Ordner in eine Datei schreiben um beim
nächsten mal prüfen zu können.

Darüber habe ich nicht nachgedacht. :smile: Das wäre aber eine Möglichkeit, ja. Aber …

Also müsste ich nach dem Scan die Datei füllen
Ich habe in der For Schleife Folgende Variablen

Folderx = (SubFoldersNow.ParentFolder + „“ +
SubFoldersNow.Name)
Datex = (SubFoldersNow.DateLastModified)

OK.

Dabei habe ich Probleme mit folgenden Code.
Wie muss es aussehen wenn ich nun bei jedem durchlauf die
beiden Variablen Fortlaufend in die Datei schreiben möchte ?
Wo gebe ich den Datei Pfad an ? Der Pfad muss in der na
Variable stehen oder ?

??? Nein, ganz bestimmt nicht. Du willst doch die geprüfte Datei nicht überschreiben. Na ist der Name Deiner Protokolldatei.

 Dim ff As Integer
 ff = FreeFile
 Dim wert As String, n As Integer
 Open na For Input As #ff
 While Not EOF(ff)
 Line Input #ff, wert
 Pfad(n) = Wert
 Line Input #ff, wert
 Datum(n) = Wert
 n = n + 1
 Wend
 Close #ff

Damit liest Du die Daten aus der Datei. Schreiben wäre:

 Dim ff As Integer
 ff = FreeFile
 Dim wert As String, n As Integer
 Open na For Output As #ff
 'Schleife
 Folderx = (SubFoldersNow.ParentFolder \_
 + SubFoldersNow.Name)
 Datex = (SubFoldersNow.DateLastModified)
 Print #ff, FolderX
 Print #ff, Datex 
 Close #ff

Und jetzt kommt der brocken.
Ich starte mein Synchtool erneut öffne die Datei und prüfe nun
welcher Ordner auf dem Server des Datum in Der Datei

/

Ja, da wird es lustig, Du mußt die richtige Zeile finden. :smile:
Dabei hilft Dir aber, daß die Zeilen ja immer sortiert sind, immer in der selben Reihenfolge. Wenn’s nicht passt, mußt Du nur Zeilen auslassen, neu lesen … Du mußt in jedem Fall den richtigen Pfad ‚suchen‘.

Ich hätte ja darüber nachgedacht, ob man da ‚mogeln‘ kann,z.B. indem man ‚.DateCreated‘ ständig überschreibt, das spart die Protokolldatei komplett. kA ob das wirklich geht, würde ich mir aber ansehen, wenn DateCreated sonst nicht gebraucht wird …

Gruß, Rainer

Ich versuche es mal Schritt für Schritt…

Heute geht bei mir nix mehr:
So würde ich es gern haben aber ohne For i schleife geht das wohl nicht.

Open „D:\test.txt“ For Output As #ff
For Each SubFoldersNow In SubFolders
ScanDir (SubFoldersNow.ParentFolder + „“ + SubFoldersNow.Name)

Folderx = (SubFoldersNow.ParentFolder _

  • SubFoldersNow.Name)
    Datex = (SubFoldersNow.DateLastModified)
    Print #ff, Folderx
    Print #ff, Datex
    'List1.AddItem Folderx
    Next
    Close #ff

ich gehe erstma Duschen …

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Joe,

Gegenvorschlag:

Option Explicit

Dim MyFSO
Dim ff As Integer

Private Sub Command1\_Click()
 Set MyFSO = CreateObject("Scripting.FileSystemObject")
 ff = FreeFile
 Open "C:\Test.txt" For Output As #ff
 ScanDir ("C:\Bluebyte")
 Close #ff
 Command1.Caption = "Fertig"
End Sub

Sub ScanDir(ScanPfad)
 Dim PathObject, SubFolders, SubFoldersNow

 Set PathObject = MyFSO.getFolder(ScanPfad)

 Set SubFolders = PathObject.SubFolders
 For Each SubFoldersNow In SubFolders
 Print #ff, (SubFoldersNow.ParentFolder + "\" + SubFoldersNow.Name)
 Print #ff, SubFoldersNow.DateLastModified
 ScanDir (SubFoldersNow.ParentFolder + "\" + SubFoldersNow.Name)
 Next
End Sub

Getestet, läuft. :smile:

Das ist erst mal nur die Schreibroutine. Die Prüfung wird komplizierter. :smile:

Gruß, Rainer

Hi

kurz mal gefragt:
kann ich auf eine Variable einen Filter anwenden ?
Ich würde gern prüfen SubFoldersNow.Name mit Link beginnt oder an
5ter stelle ein - hat. Wenn das mit einem 2Zeiler Möglich wäre würde
die Liste etwas übersichtlicher.

mfg joe

Gegenvorschlag:

Option Explicit

Dim MyFSO
Dim ff As Integer

Private Sub Command1_Click()
Set MyFSO = CreateObject(„Scripting.FileSystemObject“)
ff = FreeFile
Open „C:\Test.txt“ For Output As #ff
ScanDir („C:\Bluebyte“)
Close #ff
Command1.Caption = „Fertig“
End Sub

Sub ScanDir(ScanPfad)
Dim PathObject, SubFolders, SubFoldersNow

Set PathObject = MyFSO.getFolder(ScanPfad)

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

Getestet, läuft. :smile:

Das ist erst mal nur die Schreibroutine. Die Prüfung wird
komplizierter. :smile:

Gruß, Rainer

Hi Joe,

kann ich auf eine Variable einen Filter anwenden ?

Nein, das geht nur mit Datenbanken oder Steuerelementen, in denen das programmiert ist.

Ich würde gern prüfen SubFoldersNow.Name mit Link beginnt oder an
5ter stelle ein - hat.

 If Left(SubFoldersNow.Name, 4) = "Link" Or Mid(SubFoldersNow.Name, 5, 1) = "-" Then
 'Code, wenn Ja
 Else
 'Code, wenn nein
 End If

Dafür brauchst Du keinen Filter, der würde Dir nur die Reihenfolge durcheinander bringen und die Prüfung erschweren.

Gruß, Rainer

Danke,

Theoretisch würde ich nun die ganze datei In Variablen Laden:
VarFolder1-x soviele wie gebraucht werden.
Nun Scanne ich das QuellLAuferk und baue mir ein Case ?konstrukt?

Select Case SubFoldersNow.Name

VarFolder1
If VarDate1 SubFoldersNow.DateLastModified then
copy…
end if

VarFolder2
If VarDate2 SubFoldersNow.DateLastModified then
copy…
end if

VarFolder3

Else Select
Copy …
End Select

das ist ein anfang oder ?

Hallo,

Theoretisch würde ich nun die ganze datei In Variablen Laden:
VarFolder1-x soviele wie gebraucht werden.

So wie Du das aufgebaut hast, könnte das so laufen.
Denk aber noch einmal darüber nach. Du brauchst ein Logfile, zwei recht große Arrays, liest dann die Verzeichnisse aus … wenn das ein paar Verzeichnisse mehr sind, geht Dir der Rechner in die Knie, so viele Daten sind das.

Nun Scanne ich das QuellLAuferk und baue mir ein Case
?konstrukt?

Select Case SubFoldersNow.Name

VarFolder1
If VarDate1 SubFoldersNow.DateLastModified then
copy…
end if

VarFolder2
If VarDate2 SubFoldersNow.DateLastModified then
copy…
end if

VarFolder3

Else Select
Copy …
End Select

Hmmm, was Du an der stelle mit Select Case willst, verstehe ich nicht ganz, aber das scheint auch schon der dritte Schritt zu sein. :smile: Du mußt erst mal sicher stellen, daß die Namen überein stimmen, denn es kann ja in der Zwischenzeit ein Verzeichnis gelöscht oder neu angelegt worden sein, das mußt Du erst mal berücksichtigen und dafür sorgen, daß Dein Programm damit klar kommt.

Wenn Du Select Case verwenden willst, dann mit der richtigen Syntax, sonst klappt das nicht.

 Select Case Nummer
 Case 1
 'Code wenn Nummer = 1
 Case 2
 '...
 Case Else
 'Wenn gar nichts passt
 End Select

Gruß, Rainer

Ok…Das schaue ich mir die Tage nochmal an :stuck_out_tongue:
Anderer Gedanke:
Ich habe den ganzen Ordner mit allen UnterOrdner Kopiert und lasse einen Zeitstempel in die Datei schreiben. Also letzter SYnch
21.2.2007 20:00. Kann ich jetzt nach ORdnern suchen die nach diesem Datum verändert wurden ? klingt erstma leichter.

Mfg joe

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Joe,

Ok…Das schaue ich mir die Tage nochmal an :stuck_out_tongue:
Anderer Gedanke:
Ich habe den ganzen Ordner mit allen UnterOrdner Kopiert und
lasse einen Zeitstempel in die Datei schreiben. Also letzter
SYnch
21.2.2007 20:00. Kann ich jetzt nach ORdnern suchen die nach
diesem Datum verändert wurden ? klingt erstma leichter.

klar geht das, aber das ist extrem langsam, Du mußt jedes mal die ganzen Verzeichnisse scannen. Was hast Du dagegen, die Verzeichnisse der Reihe nach zu prüfen und wenn die Namen nicht überein stimmen zu prüfen, ob Verzeichnisse hinzugefügt oder entfernt wurden? Das geht während dem Lesen der Textdatei, dazu mußt Du nichts in ein Array schreiben und die schnellste Variante ist das auch, denke ich.

Gruß, Rainer

Hi Rainer,
ich befürchte das mit der Verzeichnisprüfung ist ne nummer zu gross für mich … Ein Array ist ein Speicherbereich oder ? da muss ich erstma nachschauen. Ich Probiere mal ein bischen rum.

Wie lese ich die Datei fortlaufend in VAriablen ein ?

Dim ff As Integer
ff = FreeFile
Dim wert As String, n As Integer
Open D:\test.txt For Input As #ff
While Not EOF(ff)
Line Input #ff, textausderdatei
n = n + 1
Wend
Close #ff

ich teste das erstma,bis gleich

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

ich befürchte das mit der Verzeichnisprüfung ist ne nummer zu
gross für mich …

ach was, das wird schon. Ich mag nur nicht das ganze Projekt fertig machen daß Du es nur noch kopieren mußt, das ist Arbeit … :smile:

Ein Array ist ein Speicherbereich oder ?

Jein. Ein Feld aus indizierten Variablen.

Dim Text As String - ist nur eine Variable.
Dim Text(0 to 2) As string ist ein Array, drei Variablen.
Text(0)
Text(1)
Text(2)

Wie lese ich die Datei fortlaufend in VAriablen ein ?

Das geht nur mit einem Array

 Dim ff As Integer
 ff = FreeFile
 Dim wert As String, n As Integer
 Open D:\test.txt For Input As #ff
 While Not EOF(ff)
 Line Input #ff, TextAusDerDatei
 Text(n) = TextAusDerDatei 
 n = n + 1
 Wend
 Close #ff

Gruß, Rainer

hi,
Schaust Pro7 oder warum bist noch wach :stuck_out_tongue:
Ich bin Dir Dankbar das du hier nicht gleich den kompletten Code einfügst. Ich habe ja echt gefallen ab Programmieren gefunden. Auch wenn ich schon Visionen zu anderen Tools habe und nichtmal ein Komplexes fertig…

Wie Deklarier ich das Array oder wie sage ich wie gross es wird ?
habe mal Dim Text(0 to 1000) As STring
Dim Datex (0 to 1000) As String getestet ging aber nicht,
normal müsste ich doch in die Schleife schreiben
Dim Datex(n) As String oder ?

Mein frage war eigentlich:
ff = FreeFile
Dim wert As String, n As Integer
Open „D:\test.txt“ For Input As #ff
While Not EOF(ff)
Line Input #ff, Text(n)
Line Input #ff, Datex(n)
'Text(n) = textausderdatei
n = n + 1
Wend
Close #ff
End Sub

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hi Joe,

Schaust Pro7 oder warum bist noch wach :stuck_out_tongue:

nö. Die Kiste ist aus. Ich lese kreuz und quer bei w-w-w und spiele nebenbei ein Spiel. :smile: Du hast aber Recht, der Urlaub ist zu Ende, ich muß morgen wieder … :frowning:

Ich bin Dir Dankbar das du hier nicht gleich den kompletten
Code einfügst. Ich habe ja echt gefallen ab Programmieren
gefunden. Auch wenn ich schon Visionen zu anderen Tools habe
und nichtmal ein Komplexes fertig…

Wenn ich Dir den ganzen Code fertig mache, kopierst Du den nur, verstehst ihn nicht und hast beim nächsten mal die selben Probleme. Wenn Du nur einzelne Fragen stellst, so wie hier, ist es auch keine Arbeit zu antworten und einen Dreizeiler zu tippen. Das bekommen wir gemeinsam schon fertig. :smile:

Wie Deklarier ich das Array oder wie sage ich wie gross es
wird ?
habe mal Dim Text(0 to 1000) As STring
Dim Datex (0 to 1000) As String getestet ging aber nicht,

Doch das geht.

normal müsste ich doch in die Schleife schreiben
Dim Datex(n) As String oder ?

Nein, das hast Du falsch verstanden.

Ich mach ein Beispiel:

Option Explicit

Private Sub Command1\_Click()
 Dim n(10) As Integer
 Dim i As Integer
 For i = 0 To 10
 n(i) = i
 Next

 Me.Cls
 For i = 0 To 10
 Me.Print n(i)
 Next
End Sub

wenn Du den Code startest sollte
0
1
2
3
4
5
6
7
8
9
10

auf der Form stehen.

Mein frage war eigentlich:
ff = FreeFile
Dim wert As String, n As Integer
Open „D:\test.txt“ For Input As #ff
While Not EOF(ff)
Line Input #ff, Text(n)
Line Input #ff, Datex(n)
'Text(n) = textausderdatei
n = n + 1
Wend
Close #ff
End Sub

??? Texte aus der Datei sind doch Text(n) …(Übrigens, das geht so nicht!) und Datex(n) … (Nein, da keine Arrays schreiben, das kann VB nicht.) Den text aus der Datei lesen macht doch LineInput.

Gruß, Rainer

Danke Rainer,

Es funktioniert wie folgt:
Ich habe textx für den Ordnername & Datex für das ÄnderungsDatum.
Muss aber jetzt pennen… habe noch 5 1/2 Std schlaf offen.
Hast du zufällig mal ein Hello World Programm für Windows CE Also Windows Mobile 5 gesehen oder geschrieben ?
Naja,Danke nochma. bis später

Private Sub Command2_Click()
Dim ff As Integer
Dim Textx(99999) As String
Dim Datex(99999) As String
Dim textvar As String
Dim textdate As String
ff = FreeFile
Dim n As Integer
Open „D:\test.txt“ For Input As #ff
While Not EOF(ff)
Line Input #ff, textvar
Line Input #ff, textdate
Textx(n) = textvar
Datex(n) = textdate
List1.AddItem Textx(n) & Datex(n)

n = n + 1
Wend

Close #ff
End Sub