Ordner/Datein vergleichen mit API. FSO war gestern

Hallo,
Ich habe mir ein BSP zum rekursiven durchsuchen von Dateien und Verzeichnissen runtergeladen (Danke Rainer).
http://www.activevb.de/tipps/vb6tipps/tipp0128.html

Meine erste kleine frage:
Max = GetAllFiles(LCase(Text1.Text), Such, Files, _
(Check1.Value = Checked))
Da ich die CheckBox nicht brauche möchte ich die Prüfung entfernen.
Ich sehe aber keine IF Anweisung. Wird das(Check1.Value = Checked) einfach entfernt ?
Max = GetAllFiles(LCase(Text1.Text), Such, Files)
das funktioniert aber nicht:/

Ich möchte die Datein zweier Ordner und Unterordner vergleichen.
C:\quellordner
C:\zielordner
wenn die datei im Quellordner neuer als die im zielordner ist soll diese Kopiert werden.
wie mache ich mit API die datumsprüfung ? und wie übergebe ich den Pfad der datei um zu schauen ob die Zieldatei gleich oder ungleich des änderungsdatum der quelldatei ist.

bis später

Hi Joe,

Meine erste kleine frage:
Max = GetAllFiles(LCase(Text1.Text), Such, Files, _
(Check1.Value = Checked))
Da ich die CheckBox nicht brauche möchte ich die Prüfung
entfernen.
Ich sehe aber keine IF Anweisung.

*gg* doch, die ist da. :smile:

Check1.Value wird als Parameter an die Funktion GetAllFiles übergeben und dort steht:

If DoRecursion Then

Wenn Du da die Prüfung entfernst, kannst Du auch ‚DoRecursion‘ aus ‚Private Function …‘ entfernen und dann natürlich die Checkboch und die Übergabe des Zustandes der Checkbox. :smile:

Gruß, Rainer

Sehr gut,
alles entfernt und das Programm läuft noch *g
Nun habe ich „List1.AddItem Files(X)“ aber ohne datum :confused:
mit FSO sah meine prüfung so aus:

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

If dt1 dt2 Then
FileCopy FileNow, ZielDatei
End If

aber um überhaupt prüfen zu können muss ich erstmal die Zieldatei „finden“ Problem ist das in der Text1.text der Pfad drin steht C:\Quellordner und dieser auch mit ausgegen wird.
soll ich hier einfach:
Files = replace(Files, text1.text, „“)
benutzen ?

Hi Joe,

in der Zeile

Field(UsedField) = " " & Root & File

wird der Pfad (Root) und Dateiname (File) in ein Array geschrieben um es später anzuzeigen.

Pfad und Namen hast Du, nun mußt Du nur noch mit

Private Declare Function GetFileTime Lib "kernel32" \_
(ByVal hFile As Long, lpCreationTime As FILETIME, \_
lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long

Datum und Zeit lesen, damit Du die gefundenen Dateien vergleichen kannst.

Gruß, Rainer

Das ist doch doppelt gemoppelt oder ?

Private Declare Function GetFileTime Lib „kernel32“ _
(ByVal hFile As Long, lpCreationTime As FILETIME, _
lpLastAccessTime As FILETIME, lpLastWriteTime As FILETIME) As Long

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Const MAX_PATH As Long = 259&

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

Steht die Funktion an der falschen stelle wenn ich sie in später in einem Sub aufrufen möchte ?

filedate = GetFileTime(File)

Hi Joe,

Das ist doch doppelt gemoppelt oder ?

ach ja, das ist ja schon drin, war mir nicht aufgefallen, sorry. Der Code ist ja nicht von mir.

Steht die Funktion an der falschen stelle wenn ich sie in
später in einem Sub aufrufen möchte ?

filedate = GetFileTime(File)

Dafür gibt es keine falsche Stelle. Die API funktioniert immer, wenn sie deklariert ist. Aber (File) wird nicht reichen, außer Du schreibst in der Zwischenzeit den Pfad mit dazu. Im Beispiel ist mir aufgefallen, daß ‚File‘ keinen Pfad enthält.

Gruß, Rainer

Hi Rainer,

Sub Or Function not defined

Ich habe im „Header“ des Codes:

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

und in der Function:

Private Function GetAllFiles(ByVal Root As String, _
ByVal Such As String, ByRef Field() As String, _
Optional UsedField As Long = 0) As Long

möchte ich das datum erfragen:
path = Root & File
filedate = GetFileTime(path)

was mache ich nur falsch ./

mfg joe

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

Hi Joe,

Sub Or Function not defined

Ich habe im „Header“ des Codes:

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

und in der Function:

Private Function GetAllFiles(ByVal Root As String, _
ByVal Such As String, ByRef Field() As String, _
Optional UsedField As Long = 0) As Long

möchte ich das datum erfragen:
path = Root & File
filedate = GetFileTime(path)

GetFileTime hast Du doch gar nicht deklariert. Sieh doch mal nach, was in ftLastAccessTime steht. Wenn Du das später noch mal lesen möchtest, mußt Du GetFileTime doch deklarieren.

Gruß, Rainer

VB6 Kurse sind TEUER !
hi Rainer…ich drehe mich im Kreis.

habe nur ein BSP.gefunden

lngHandle = CreateFile(„c:\so.txt“, GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)

GetFileTime lngHandle, udtFileTime, udtFileTime, udtFileTime
FileTimeToLocalFileTime udtFileTime, udtFileTime
FileTimeToSystemTime udtFileTime, SysTime
CloseHandle lngHandle

Warum lngHandle mit CreateFile ?
reicht nicht lnghandle =„so.txt“
und warum 3x die gleiche variable ? udtfiletime ?
da stehen doch unterschiedliche werte oder ? create zugriff & write

ich will doch nur von der variable path den write zeitstempel …

mfg joe

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

Hi Joe,

hi Rainer…ich drehe mich im Kreis.

verstehe ich nicht. Du hast doch schon zwei fertige Lösungen. :smile:
1.) Das ursprüngliche Beispiel, in dem Du inzwischen ein paar Sachen entfernt hast. In der Basisvariante wird ja eine Liste mit den Namen von Verzeichnissen und Dateien gefüllt. Da werden nebenbei auch die Datumsstempel mit gelesen, die Du mit ausgeben oder eben in ein Array schreiben könntest. Dann hast Du alles in einem Durchlauf, vermutlich die schnellste Variante.
2.) Wenn Du das Datum später lesen möchtest, kannst Du das mit dem API-Aufruf machen, den ich weiter oben gepostet habe.

habe nur ein BSP.gefunden

lngHandle = CreateFile(„c:\so.txt“, GENERIC_WRITE,
FILE_SHARE_READ Or FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING,
0, 0)

GetFileTime lngHandle, udtFileTime, udtFileTime, udtFileTime
FileTimeToLocalFileTime udtFileTime, udtFileTime
FileTimeToSystemTime udtFileTime, SysTime
CloseHandle lngHandle

Warum lngHandle mit CreateFile ?
reicht nicht lnghandle =„so.txt“

Nein, die API möchte so aufgerugen werden und gibt ein Handle zurück.

und warum 3x die gleiche variable ? udtfiletime ?
da stehen doch unterschiedliche werte oder ? create zugriff &
write

Nein, das ist ein definierter Typ, der mehrere Daten enthält. Sie Dir im Beispiel die Zeilen:

Private Type …
Variabe
End Type

an.

ich will doch nur von der variable path den write zeitstempel

Den hast Du doch schon gelesen. Der steht nach dem Lesen in der Variablen ftLastWriteTime , Du musst ihn nur mit dem Namen zusammen wegschreiben. Ich würde dafür zwei Arrays nehmen, Datei und Datum jeweils mit dem selben Index.

Gruß, Rainer

Seh den Wald vor lauter Bäumen nicht :confused:
wo kann ich hier das datum zur datei abfragen ?

Private Function GetAllFiles(ByVal Root As String, _
ByVal Such As String, ByRef Field() As String, _
Optional UsedField As Long = 0) As Long

Dim rootx As String
Dim File As String
Dim hFile As Long
Dim FD As WIN32_FIND_DATA

’ Evtl. Array vergrößern?
If (UsedField = UBound(Field)) Then
ReDim Preserve Field(UBound(Field) + 100)
End If

DoEvents

'Backslash ergänzen
If Right(Root, 1) „“ Then Root = Root & „“

’ Die erste Datei suchen
hFile = FindFirstFile(Root & „*.*“, FD)

’ Es konnte nichts gefunden werden
If hFile = 0 Then
GetAllFiles = 0
Exit Function
End If

’ Für jede Datei
Do
’ Den Dateinamen extrahieren
File = Left(FD.cFileName, InStr(FD.cFileName, Chr(0)) - 1)

’ Ist die Datei ein Verzeichnis?
If (FD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY) _
= FILE_ATTRIBUTE_DIRECTORY Then

’ . und … ignorieren
If (File „.“) And (File „…“) Then

’ Unterordner rekursiv erfassen
GetAllFiles = GetAllFiles + GetAllFiles(Root & File, _
Such, Field, UsedField)

End If
Else

’ Passt das Suchmuster?
If (Such Like Right$(UCase$(File), Len(Such))) Or Such = _
„*“ Then

’ Ergebnis speichern
’ Datei: " " kann entfernt werden,
’ da nur zur Visualisierung
Field(UsedField) = Root & File
path = Root & File

rootx = Replace(Root, rootcut, „“) 'ACHTUNG -rootcut
'List2.AddItem rootx & File & filedate
List2.AddItem ftLastWriteTime
GetAllFiles = GetAllFiles + 1
UsedField = UsedField + 1

’ Evtl. Array vergrößern
If (UsedField = UBound(Field)) Then
ReDim Preserve Field(0 To UBound(Field) + 100)
End If
End If
End If

’ Nächste Datei suchen
Loop While FindNextFile(hFile, FD)

’ Suchhandle wieder freigeben - Suche beenden
Call FindClose(hFile)
End Function

Hi Joe,

ich habe mir jetzt mal das Original vorgenommen, außer dem Button und der Liste alles entfernt und das Lesen des Datums mit eingebaut. Irgend ein Fehlerchen ist noch drin, das Datum wird für jedes Verzeichnis angezeigt, aber natürlich ein Wert, der Unfug ist. Das bekommst Du aber selbst entfernt.

Option Explicit

Private Declare Function FindFirstFile Lib "kernel32" \_
 Alias "FindFirstFileA" (ByVal lpFileName As String, \_
 lpFindFileData As WIN32\_FIND\_DATA) As Long

Private Declare Function FindNextFile Lib "kernel32" \_
 Alias "FindNextFileA" (ByVal hFindFile As Long, \_
 lpFindFileData As WIN32\_FIND\_DATA) As Long

Private Declare Function FindClose Lib "kernel32" (ByVal \_
 hFindFile As Long) As Long

Private Type FILETIME
 dwLowDateTime As Long
 dwHighDateTime As Long
End Type
Private Type SHFILEOPSTRUCT
 hWnd As Long
 wFunc As Long
 pFrom As String
 pTo As String
 fFlags As Integer
 fAborted As Boolean
 hNameMaps As Long
 sProgress As String
End Type
Private Type SYSTEMTIME
 wYear As Integer
 wMonth As Integer
 wDayOfWeek As Integer
 wDay As Integer
 wHour As Integer
 wMinute As Integer
 wSecond As Integer
 wMilliseconds As Integer
End Type

Private Declare Function GetFileTime Lib "kernel32" (ByVal \_
 hFile As Long, lpCreationTime As FILETIME, \_
 lpLastAccessTime As FILETIME, lpLastWriteTime \_
 As FILETIME) As Long

Const MAX\_PATH As Long = 259&

Private Type WIN32\_FIND\_DATA
 dwFileAttributes As Long
 ftCreationTime As FILETIME
 ftLastAccessTime As FILETIME
 ftLastWriteTime As FILETIME
 nFileSizeHigh As Long
 nFileSizeLow As Long
 dwReserved0 As Long
 dwReserved1 As Long
 cFileName As String \* MAX\_PATH
 cAlternate As String \* 14
End Type

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" \_
 (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, \_
 ByVal dwShareMode As Long, lpSecurityAttributes As Long, \_
 ByVal dwCreationDisposition As Long, ByVal \_
 dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function FileTimeToSystemTime Lib "kernel32" \_
 (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long

Private Declare Function FileTimeToLocalFileTime Lib "kernel32" \_
 (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long

Private Const GENERIC\_WRITE = &H40000000
Private Const OPEN\_EXISTING = 3
Private Const FILE\_SHARE\_READ = &H1
Private Const FILE\_SHARE\_WRITE = &H2
Private Const FO\_DELETE = &H3

Const FILE\_ATTRIBUTE\_ARCHIVE As Long = &H20&
Const FILE\_ATTRIBUTE\_COMPRESSED As Long = &H800&
Const FILE\_ATTRIBUTE\_DIRECTORY As Long = &H10&
Const FILE\_ATTRIBUTE\_HIDDEN As Long = &H2&
Const FILE\_ATTRIBUTE\_NORMAL As Long = &H80&
Const FILE\_ATTRIBUTE\_READONLY As Long = &H1&
Const FILE\_ATTRIBUTE\_SYSTEM As Long = &H4&
Const FILE\_ATTRIBUTE\_TEMPORARY As Long = &H100&

Private Sub Command1\_Click()
 Dim Files() As String
 Dim X As Long
 Dim Such As String
 Dim DatCnt As Integer, DirCnt As Integer
 Dim Max As Long

 ' Ein Einfaches Suchmuster erstellen
 Such = "\*"
 'If Left$(Such, 1) = "\*" Then Such = Right$(Such, Len(Such) - InStr(Such, "."))

 ReDim Files(0 To 0)

 ' Suchen
 MousePointer = 11
 DoEvents

 Max = GetAllFiles("C:\Programme\Microsoft Visual Studio\VB98", Such, Files)

 MousePointer = 0
 DoEvents

 List1.Clear

 ' Die Ergebnisse auflisten
 List1.Visible = False
 For X = 0 To Max - 1
 List1.AddItem Files(X)

 If Left$(Files(X), 2) = "\>\>" Then
 DirCnt = DirCnt + 1
 Else
 DatCnt = DatCnt + 1
 End If
 Next X
 List1.Visible = True

End Sub

' Durchsucht einen Ordner nach Dateien
' Sollte der Ordner selbst nicht durchsucht werden können,
' gibt die Funktion 0 zurück. Sonst wird die Anzahl der Dateien zurückgegeben
Private Function GetAllFiles(ByVal Root As String, \_
 ByVal Such As String, ByRef Field() As String, \_
 Optional UsedField As Long = 0) As Long

 Dim File As String
 Dim hFile As Long
 Dim FD As WIN32\_FIND\_DATA

 Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong As Long
 Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As SYSTEMTIME

 ' Evtl. Array vergrößern?
 If (UsedField = UBound(Field)) Then
 ReDim Preserve Field(UBound(Field) + 100)
 End If

 DoEvents

 'Backslash ergänzen
 If Right(Root, 1) "\" Then Root = Root & "\"

 ' Die erste Datei suchen
 hFile = FindFirstFile(Root & "\*.\*", FD)

 ' Es konnte nichts gefunden werden
 If hFile = 0 Then
 GetAllFiles = 0
 Exit Function
 End If

 ' Für jede Datei
 Do
 ' Den Dateinamen extrahieren
 File = Left(FD.cFileName, InStr(FD.cFileName, Chr(0)) - 1)

 ' Ist die Datei ein Verzeichnis?
 If (FD.dwFileAttributes And FILE\_ATTRIBUTE\_DIRECTORY) \_
 = FILE\_ATTRIBUTE\_DIRECTORY Then

 ' . und .. ignorieren
 If (File ".") And (File "..") Then

 ' Unterordner auch durchsuchen?

 ' Unterordner rekursiv erfassen
 GetAllFiles = GetAllFiles + GetAllFiles(Root & File, \_
 Such, Field, UsedField)
 Else

 ' Ergebnis speichern
 ' Verzeichnis: "\>\>" kann entfernt werden,
 ' da nur zur Visualisierung

 Field(UsedField) = "\>\>" & Root & File
 GetAllFiles = GetAllFiles + 1
 UsedField = UsedField + 1

 ' Evtl. Array vergrößern
 If (UsedField = UBound(Field)) = 0 Then
 ReDim Preserve Field(0 To UBound(Field) + 100)
 End If
 End If
 End If

 ' Passt das Suchmuster?
 If (Such Like Right$(UCase$(File), Len(Such))) Or Such = "\*" Then

 ' Ergebnis speichern
 ' Datei: " " kann entfernt werden,
 ' da nur zur Visualisierung

 lngHandle = CreateFile(Root & File, GENERIC\_WRITE, FILE\_SHARE\_READ Or \_
 FILE\_SHARE\_WRITE, ByVal 0&, OPEN\_EXISTING, 0, 0)
 GetFileTime lngHandle, Ft1, Ft1, Ft2
 FileTimeToLocalFileTime Ft2, Ft1
 FileTimeToSystemTime Ft1, SysTime


 Field(UsedField) = " " & Root & File + Str$(SysTime.wMonth) \_
 + "/" + LTrim(Str$(SysTime.wDay)) + "/" + LTrim(Str$(SysTime.wYear))

 GetAllFiles = GetAllFiles + 1
 UsedField = UsedField + 1

 ' Evtl. Array vergrößern
 If (UsedField = UBound(Field)) Then
 ReDim Preserve Field(0 To UBound(Field) + 100)
 End If
 End If

 ' Nächste Datei suchen
 Loop While FindNextFile(hFile, FD)

 ' Suchhandle wieder freigeben - Suche beenden
 Call FindClose(hFile)
End Function

Gruß, Rainer

Das Datum ist komisch da nun versucht wurde mit getfiledate ein Datum von einem Ordner zu bekommen das geht wohl nicht. Ein END IF fehlte bzw war falsch nun bekomme ich zu den Files ein sinvolles Datum aber es sind immernoch Ordner dazwischen … wie filter ich diese raus ?
Das wurde mit
If (File „.“) And (File „…“) Then gemacht funktioniert aber nichtmehr

mfg joe

Hi Joe

ich habe mir jetzt mal das Original vorgenommen, außer dem
Button und der Liste alles entfernt und das Lesen des Datums
mit eingebaut. Irgend ein Fehlerchen ist noch drin, das Datum
wird für jedes Verzeichnis angezeigt, aber natürlich ein Wert,
der Unfug ist. Das bekommst Du aber selbst entfernt.

Option Explicit

Private Declare Function FindFirstFile Lib „kernel32“ _
Alias „FindFirstFileA“ (ByVal lpFileName As String, _
lpFindFileData As WIN32_FIND_DATA) As Long

Private Declare Function FindNextFile Lib „kernel32“ _
Alias „FindNextFileA“ (ByVal hFindFile As Long, _
lpFindFileData As WIN32_FIND_DATA) As Long

Private Declare Function FindClose Lib „kernel32“ (ByVal _
hFindFile As Long) As Long

Private Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type
Private Type SHFILEOPSTRUCT
hWnd As Long
wFunc As Long
pFrom As String
pTo As String
fFlags As Integer
fAborted As Boolean
hNameMaps As Long
sProgress As String
End Type
Private Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type

Private Declare Function GetFileTime Lib „kernel32“ (ByVal _
hFile As Long, lpCreationTime As FILETIME, _
lpLastAccessTime As FILETIME, lpLastWriteTime _
As FILETIME) As Long

Const MAX_PATH As Long = 259&

Private Type WIN32_FIND_DATA
dwFileAttributes As Long
ftCreationTime As FILETIME
ftLastAccessTime As FILETIME
ftLastWriteTime As FILETIME
nFileSizeHigh As Long
nFileSizeLow As Long
dwReserved0 As Long
dwReserved1 As Long
cFileName As String * MAX_PATH
cAlternate As String * 14
End Type

Private Declare Function CreateFile Lib „kernel32“ Alias
„CreateFileA“ _
(ByVal lpFileName As String, ByVal dwDesiredAccess As
Long, _
ByVal dwShareMode As Long, lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, ByVal _
dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long)
As Long

Private Declare Function FileTimeToSystemTime Lib „kernel32“ _
(lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As
Long

Private Declare Function FileTimeToLocalFileTime Lib
„kernel32“ _
(lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As
Long

Private Const GENERIC_WRITE = &H40000000
Private Const OPEN_EXISTING = 3
Private Const FILE_SHARE_READ = &H1
Private Const FILE_SHARE_WRITE = &H2
Private Const FO_DELETE = &H3

Const FILE_ATTRIBUTE_ARCHIVE As Long = &H20&
Const FILE_ATTRIBUTE_COMPRESSED As Long = &H800&
Const FILE_ATTRIBUTE_DIRECTORY As Long = &H10&
Const FILE_ATTRIBUTE_HIDDEN As Long = &H2&
Const FILE_ATTRIBUTE_NORMAL As Long = &H80&
Const FILE_ATTRIBUTE_READONLY As Long = &H1&
Const FILE_ATTRIBUTE_SYSTEM As Long = &H4&
Const FILE_ATTRIBUTE_TEMPORARY As Long = &H100&

Private Sub Command1_Click()
Dim Files() As String
Dim X As Long
Dim Such As String
Dim DatCnt As Integer, DirCnt As Integer
Dim Max As Long

’ Ein Einfaches Suchmuster erstellen
Such = „*“
'If Left$(Such, 1) = „*“ Then Such = Right$(Such,
Len(Such) - InStr(Such, „.“))

ReDim Files(0 To 0)

’ Suchen
MousePointer = 11
DoEvents

Max = GetAllFiles(„C:\Programme\Microsoft Visual
Studio\VB98“, Such, Files)

MousePointer = 0
DoEvents

List1.Clear

’ Die Ergebnisse auflisten
List1.Visible = False
For X = 0 To Max - 1
List1.AddItem Files(X)

If Left$(Files(X), 2) = „>>“ Then
DirCnt = DirCnt + 1
Else
DatCnt = DatCnt + 1
End If
Next X
List1.Visible = True

End Sub

’ Durchsucht einen Ordner nach Dateien
’ Sollte der Ordner selbst nicht durchsucht werden können,
’ gibt die Funktion 0 zurück. Sonst wird die Anzahl der
Dateien zurückgegeben
Private Function GetAllFiles(ByVal Root As String, _
ByVal Such As String, ByRef Field() As String, _
Optional UsedField As Long = 0) As Long

Dim File As String
Dim hFile As Long
Dim FD As WIN32_FIND_DATA

Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong
As Long
Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As
SYSTEMTIME

’ Evtl. Array vergrößern?
If (UsedField = UBound(Field)) Then
ReDim Preserve Field(UBound(Field) + 100)
End If

DoEvents

'Backslash ergänzen
If Right(Root, 1) „“ Then Root = Root & „“

’ Die erste Datei suchen
hFile = FindFirstFile(Root & „*.*“, FD)

’ Es konnte nichts gefunden werden
If hFile = 0 Then
GetAllFiles = 0
Exit Function
End If

’ Für jede Datei
Do
’ Den Dateinamen extrahieren
File = Left(FD.cFileName, InStr(FD.cFileName, Chr(0))

’ Ist die Datei ein Verzeichnis?
If (FD.dwFileAttributes And FILE_ATTRIBUTE_DIRECTORY)
_
= FILE_ATTRIBUTE_DIRECTORY Then

’ . und … ignorieren
If (File „.“) And (File „…“)
Then

’ Unterordner auch durchsuchen?

’ Unterordner rekursiv erfassen
GetAllFiles = GetAllFiles +
GetAllFiles(Root & File, _
Such, Field, UsedField)
Else

’ Ergebnis speichern
’ Verzeichnis: „>>“ kann entfernt
werden,
’ da nur zur Visualisierung

Field(UsedField) = „>>“ & Root &
File
GetAllFiles = GetAllFiles + 1
UsedField = UsedField + 1

’ Evtl. Array vergrößern
If (UsedField = UBound(Field)) = 0 Then
ReDim Preserve Field(0 To
UBound(Field) + 100)
End If
End If
End If

’ Passt das Suchmuster?
If (Such Like Right$(UCase$(File), Len(Such))) Or
Such = „*“ Then

’ Ergebnis speichern
’ Datei: " " kann entfernt werden,
’ da nur zur Visualisierung

lngHandle = CreateFile(Root & File, GENERIC_WRITE,
FILE_SHARE_READ Or _
FILE_SHARE_WRITE, ByVal 0&, OPEN_EXISTING, 0, 0)
GetFileTime lngHandle, Ft1, Ft1, Ft2
FileTimeToLocalFileTime Ft2, Ft1
FileTimeToSystemTime Ft1, SysTime

Field(UsedField) = " " & Root & File +
Str$(SysTime.wMonth) _

  • „/“ + LTrim(Str$(SysTime.wDay)) + „/“ +
    LTrim(Str$(SysTime.wYear))

GetAllFiles = GetAllFiles + 1
UsedField = UsedField + 1

’ Evtl. Array vergrößern
If (UsedField = UBound(Field)) Then
ReDim Preserve Field(0 To UBound(Field) +
100)
End If
End If

’ Nächste Datei suchen
Loop While FindNextFile(hFile, FD)

’ Suchhandle wieder freigeben - Suche beenden
Call FindClose(hFile)
End Function

Gruß, Rainer

Hi Joe,

die Verzeichnisse willst Du gar nicht mit aufgelistet haben? Dann entferne ich den Teil doch einfach:

Option Explicit

Private Declare Function FindFirstFile Lib "kernel32" \_
 Alias "FindFirstFileA" (ByVal lpFileName As String, \_
 lpFindFileData As WIN32\_FIND\_DATA) As Long

Private Declare Function FindNextFile Lib "kernel32" \_
 Alias "FindNextFileA" (ByVal hFindFile As Long, \_
 lpFindFileData As WIN32\_FIND\_DATA) As Long

Private Declare Function FindClose Lib "kernel32" (ByVal \_
 hFindFile As Long) As Long

Private Type FILETIME
 dwLowDateTime As Long
 dwHighDateTime As Long
End Type
Private Type SHFILEOPSTRUCT
 hWnd As Long
 wFunc As Long
 pFrom As String
 pTo As String
 fFlags As Integer
 fAborted As Boolean
 hNameMaps As Long
 sProgress As String
End Type
Private Type SYSTEMTIME
 wYear As Integer
 wMonth As Integer
 wDayOfWeek As Integer
 wDay As Integer
 wHour As Integer
 wMinute As Integer
 wSecond As Integer
 wMilliseconds As Integer
End Type

Private Declare Function GetFileTime Lib "kernel32" (ByVal \_
 hFile As Long, lpCreationTime As FILETIME, \_
 lpLastAccessTime As FILETIME, lpLastWriteTime \_
 As FILETIME) As Long

Const MAX\_PATH As Long = 259&

Private Type WIN32\_FIND\_DATA
 dwFileAttributes As Long
 ftCreationTime As FILETIME
 ftLastAccessTime As FILETIME
 ftLastWriteTime As FILETIME
 nFileSizeHigh As Long
 nFileSizeLow As Long
 dwReserved0 As Long
 dwReserved1 As Long
 cFileName As String \* MAX\_PATH
 cAlternate As String \* 14
End Type

Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" \_
 (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, \_
 ByVal dwShareMode As Long, lpSecurityAttributes As Long, \_
 ByVal dwCreationDisposition As Long, ByVal \_
 dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long

Private Declare Function FileTimeToSystemTime Lib "kernel32" \_
 (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long

Private Declare Function FileTimeToLocalFileTime Lib "kernel32" \_
 (lpFileTime As FILETIME, lpLocalFileTime As FILETIME) As Long

Private Const GENERIC\_WRITE = &H40000000
Private Const OPEN\_EXISTING = 3
Private Const FILE\_SHARE\_READ = &H1
Private Const FILE\_SHARE\_WRITE = &H2
Private Const FO\_DELETE = &H3

Const FILE\_ATTRIBUTE\_ARCHIVE As Long = &H20&
Const FILE\_ATTRIBUTE\_COMPRESSED As Long = &H800&
Const FILE\_ATTRIBUTE\_DIRECTORY As Long = &H10&
Const FILE\_ATTRIBUTE\_HIDDEN As Long = &H2&
Const FILE\_ATTRIBUTE\_NORMAL As Long = &H80&
Const FILE\_ATTRIBUTE\_READONLY As Long = &H1&
Const FILE\_ATTRIBUTE\_SYSTEM As Long = &H4&
Const FILE\_ATTRIBUTE\_TEMPORARY As Long = &H100&

Private Sub Command1\_Click()
 Dim Files() As String
 Dim X As Long
 Dim Such As String
 Dim DatCnt As Integer, DirCnt As Integer
 Dim Max As Long

 Such = "\*"

 ReDim Files(0 To 0)

 MousePointer = 11
 DoEvents

 Max = GetAllFiles("C:\Programme\Microsoft Visual Studio\VB98", Such, Files)

 MousePointer = 0
 DoEvents

 List1.Clear

 List1.Visible = False
 For X = 0 To Max - 1
 List1.AddItem Files(X)

 If Left$(Files(X), 2) = "\>\>" Then
 DirCnt = DirCnt + 1
 Else
 DatCnt = DatCnt + 1
 End If
 Next X
 List1.Visible = True

End Sub

Private Function GetAllFiles(ByVal Root As String, \_
 ByVal Such As String, ByRef Field() As String, \_
 Optional UsedField As Long = 0) As Long

 Dim File As String
 Dim hFile As Long
 Dim FD As WIN32\_FIND\_DATA

 Dim lngHandle As Long, SHDirOp As SHFILEOPSTRUCT, lngLong As Long
 Dim Ft1 As FILETIME, Ft2 As FILETIME, SysTime As SYSTEMTIME

 If (UsedField = UBound(Field)) Then
 ReDim Preserve Field(UBound(Field) + 100)
 End If

 DoEvents

 If Right(Root, 1) "\" Then Root = Root & "\"

 hFile = FindFirstFile(Root & "\*.\*", FD)

 If hFile = 0 Then
 GetAllFiles = 0
 Exit Function
 End If

 Do
 File = Left(FD.cFileName, InStr(FD.cFileName, Chr(0)) - 1)

 If (FD.dwFileAttributes And FILE\_ATTRIBUTE\_DIRECTORY) \_
 = FILE\_ATTRIBUTE\_DIRECTORY Then

 If (File ".") And (File "..") Then

 GetAllFiles = GetAllFiles + GetAllFiles(Root & File, \_
 Such, Field, UsedField)
 Else

 If (UsedField = UBound(Field)) = 0 Then
 ReDim Preserve Field(0 To UBound(Field) + 100)
 End If
 End If
 End If

 If ((Such Like Right$(UCase$(File), Len(Such))) Or Such = "\*") And (File ".") And (File "..") Then

 lngHandle = CreateFile(Root & File, GENERIC\_WRITE, FILE\_SHARE\_READ Or \_
 FILE\_SHARE\_WRITE, ByVal 0&, OPEN\_EXISTING, 0, 0)
 GetFileTime lngHandle, Ft1, Ft1, Ft2
 FileTimeToLocalFileTime Ft2, Ft1
 FileTimeToSystemTime Ft1, SysTime


 Field(UsedField) = " " & Root & File + Str$(SysTime.wMonth) \_
 + "/" + LTrim(Str$(SysTime.wDay)) + "/" + LTrim(Str$(SysTime.wYear))

 GetAllFiles = GetAllFiles + 1
 UsedField = UsedField + 1

 If (UsedField = UBound(Field)) Then
 ReDim Preserve Field(0 To UBound(Field) + 100)
 End If
 End If

 Loop While FindNextFile(hFile, FD)

 Call FindClose(hFile)
End Function

Ich hoffe, daß da nicht zu viel überflüssiges mehr übrig geblieben ist, das ist ja kein selbst entwickelter Code, nur ein ‚umgestricktes‘ Beispiel. Dafür ist es aber schön schnell. :smile:

Gruß, Rainer

Hoffnung…
Moin Rainer,
Es werden noch vereinzelt Ordner mit Aufgelistet die ich aber anhand des „komischen“ Datums Filtern kann.

Ich suche verzweifelt eine BSP wie ich „CopyFileExA“ anwende.
hast du da zufällig einen Link oder ein beispiel ?

Danke dir

mfg joe

Hi Joe,

Es werden noch vereinzelt Ordner mit Aufgelistet die ich aber
anhand des „komischen“ Datums Filtern kann.

OK, Du findest die Stelle schon. :smile:

Ich suche verzweifelt eine BSP wie ich „CopyFileExA“ anwende.
hast du da zufällig einen Link oder ein beispiel ?

Ja, beides. :smile:

Das Beispiel ist aus ‚APIGuide‘, irgendwo gibt’s die wohl noch. An der Stelle, wo ich sie geladen habe, ist die aus mir unbekannten Gründen nicht. Aktuell baut AcitveVB.de eine API-Wiki, da ist schon einiges eingetragen, wenn die richtig fertig ist, ist die besser als die API-Guide.

Das Beispiel:

'in a form (Form1)
Private Sub Form\_Load()
 'KPD-Team 2001
 'URL: http://www.allapi.net/
 'E-Mail: [email protected]
 Dim Ret As Long
 'set the graphics mode to persistent
 Me.AutoRedraw = True
 'print some text
 Me.Print "Click the form to abort the filecopy"
 'show the form
 Me.Show
 'start copying
 Ret = CopyFileEx("c:\verybigfile.ext", "c:\copy.ext", AddressOf CopyProgressRoutine, ByVal 0&, bCancel, COPY\_FILE\_RESTARTABLE)
 'show some text
 Me.Print "Filecopy completed " + IIf(Ret = 0, "(ERROR/ABORTED)", "successfully")
End Sub
Private Sub Form\_Click()
 'cancel filecopy
 bCancel = 1
End Sub
'in a module
Public Const PROGRESS\_CANCEL = 1
Public Const PROGRESS\_CONTINUE = 0
Public Const PROGRESS\_QUIET = 3
Public Const PROGRESS\_STOP = 2
Public Const COPY\_FILE\_FAIL\_IF\_EXISTS = &H1
Public Const COPY\_FILE\_RESTARTABLE = &H2
Public Declare Function CopyFileEx Lib "kernel32.dll" Alias "CopyFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As Long, lpData As Any, ByRef pbCancel As Long, ByVal dwCopyFlags As Long) As Long
Public bCancel As Long
Public Function CopyProgressRoutine(ByVal TotalFileSize As Currency, ByVal TotalBytesTransferred As Currency, ByVal StreamSize As Currency, ByVal StreamBytesTransferred As Currency, ByVal dwStreamNumber As Long, ByVal dwCallbackReason As Long, ByVal hSourceFile As Long, ByVal hDestinationFile As Long, ByVal lpData As Long) As Long
 'adjust the caption
 Form1.Caption = CStr(Int((TotalBytesTransferred \* 10000) / (TotalFileSize \* 10000) \* 100)) + "% complete..."
 'allow user input
 DoEvents
 'continue filecopy
 CopyProgressRoutine = PROGRESS\_CONTINUE
End Function

Gruß, Rainer