Autor: Dieter Zornow (für XProfan 9 optimiert: Roland G. Hülsmann)
Code zur freien Verwendung
Def FindFirstFile(2) !"KERNEL32","FindFirstFileA"
Def FindNextFile(2) !"KERNEL32","FindNextFileA"
Def FindClose(1) !"KERNEL32","FindClose"
DEF FileTimeToLocalFileTime(2) !"Kernel32","FileTimeToLocalFileTime"
DEF FileTimeToSystemTime(2) !"Kernel32","FileTimeToSystemTime"
Def GetLastError(0) !"KERNEL32","GetLastError"
Struct TFileInfo = LName$(256), Langer Dateiname
SName$(12), Kurzer Dateiname (8.3)
Size!, Dateigröße (Float für Größen über 2 GB)
WDay$(10), Wochentag des letzen Schreibzugriffes (Write)
WDate$(10), Datum des letzen Schreibzugriffes
WTime$(8), Uhrzeit des letzen Schreibzugriffes
CDay$(10), Wochentag der Erstellung der Datei (create)
CDate$(10), Datum der Erstellung der Datei
CTime$(8), Uhrzeit der Erstellung der Datei
ADay$(10), Wochentag letzter Zugriff auf Datei (access)
ADate$(10), Datum des letzter Zugriff auf Datei
ATime$(8), Uhrzeit letzter Zugriff auf Datei
Attr$(10) Dateiattribut
Proc weekday
-----------
Parameters day&
Return substr$("Sonntag,Montag,Dienstag,Mittwoch,Donnerstag,Freitag,Samstag",day& + 1,",")
endproc
proc Fattrib
-----------
parameters attrib&
return if(testbit(attrib&,4),"<DIR> ","")
+ if(testbit(attrib&,0),"r","-")
+ if(testbit(attrib&,5),"a","-")
+ if(testbit(attrib&,1),"h","-")
+ if(testbit(attrib&,2),"s","-")
endproc
Proc ApiFindFile
---------------
parameters file$,filehndl&,FileInfo#
Declare info#,file#,utc#,time#,findhndl&
Dim File#,261
Dim info#,328
DIM utc#,8
DIM time#,16
String File#,0=file$
If filehndl& = 0
findhndl& = FindFirstFile(file#,info#)
else
FindNextFile(filehndl&,info#)
endif
FileInfo#.Attr$ = Fattrib(@long(Info#,0)) attribut
FileInfo#.LName$ = @String$(Info#,44) longname
FileInfo#.Sname$ = @String$(Info#,304) shortname
FileInfo#.size! = @long(Info#,28) * 65536 + @long(Info#,32) dateigröße
-------------------------Erstellzeit
FileTimeToLocalFileTime(info#+4,utc#)
FileTimeToSystemTime(utc#,time#)
if word(time#,0) >= 1601
FileInfo#.cday$ = weekday(word(time#,4))
FileInfo#.cdate$ = Format$("00",word(time#,6))+"."+Format$("00",word(time#,2))+"."+Format$("00",wor d(time#,0)) Last written date
FileInfo#.ctime$ = Format$("00",word(time#,8))+":"+Format$("00",word(time#,10))+":"+Format$("00",wo rd(time#,12)) last written time
else
FileInfo#.cday$ = ""
FileInfo#.cdate$ = "00.00.0000"
FileInfo#.ctime$ = "00:00:00"
endif
-----------------------------Letzter Zugriff
FileTimeToLocalFileTime(info#+12,utc#)
FileTimeToSystemTime(utc#,time#)
if word(time#,0) >= 1601
FileInfo#.aday$ = weekday(word(time#,4))
FileInfo#.adate$ = Format$("00",word(time#,6))+"."+Format$("00",word(time#,2))+"."+Format$("00",wor d(time#,0)) Last written date
FileInfo#.atime$ = Format$("00",word(time#,8))+":"+Format$("00",word(time#,10))+":"+Format$("00",wo rd(time#,12)) last written time
else
FileInfo#.aday$ = ""
FileInfo#.adate$ = "00.00.0000"
FileInfo#.dtime$ = "00:00:00"
endif
--------------------------- last written
FileTimeToLocalFileTime(info#+20,utc#)
FileTimeToSystemTime(utc#,time#)
if word(time#,0) >= 1601
FileInfo#.wday$ = weekday(word(time#,4))
FileInfo#.wdate$ = Format$("00",word(time#,6))+"."+Format$("00",word(time#,2))+"."+Format$("00",wor d(time#,0)) Last written date
FileInfo#.wtime$ = Format$("00",word(time#,8))+":"+Format$("00",word(time#,10))+":"+Format$("00",wo rd(time#,12)) last written time
else
FileInfo#.wday$ = ""
FileInfo#.wdate$ = "00.00.0000"
FileInfo#.wtime$ = "00:00:00"
endif
---------------------------------------
If left$(FileInfo#.attr$,5) = "<DIR>" Verzeichnisse nach oben in einer Listbox
let FileInfo#.lname$="["+Trim$(FileInfo#.lname$)+"]"
endif
Dispose File#
Dispose info#
Dispose UTC#
Dispose time#
return findhndl&
endproc
proc ApiFindFileFirst
-------------------
parameters file$,FileInfo#
Return ApiFindFile(file$,0,FileInfo#)
EndProc
proc ApiFindFileNext
------------------
parameters filehndl&,FileInfo#
Return ApiFindFile("",filehndl&,FileInfo#)
EndProc
Rückgabe: FindHandle&, Ergebnisse in: FileInfo-Struktur (s.o.)
Aufruf und Abrage:
FindHandle& = ApiFindFileFirst(Datei mit Pfad,FileInfo-Struktur)
FindHandle& = ApiFindFileNext(FindHandle&,FileInfo-Struktur)
nicht vergessen das Findhandle mit Findclose(Findhandle) zu schließen
Beispiel:
FHandle& = ApiFindFileFirst("c:\Temp*.exe",FileInfo#)
ApiFindFileNext(FHandle&,FileInfo#)
... usw
FindClose(FHandle&)
Bei *.* werden natürlich auch Verzeichnisse gefunden, diese kann man
über das "<DIR>" in FileInfo#.Attr$ sauber ausfiltern
Beispielprogramm
================
Declare Filefindhndl&
Declare FileInfo#
Dim FileInfo#,TFileInfo
window 0,0 - 1024,768
Set("Decimals",0)
Filefindhndl& = ApiFindFileFirst("C:\Documents and Settings\rhuelsma\My DocumentsDownloads\*.*",FileInfo#)
repeat
print FileInfo#.LName$ + "|"
+ FileInfo#.SName$ + "|"
+ FileInfo#.ADate$ + "|"
+ FileInfo#.ATime$ + "|"
+ FileInfo#.Attr$ + "|"
+ Format$("###,###,###,##0 Bytes",FileInfo#.Size!)
ApiFindFileNext(filefindhndl&,FileInfo#)
until GetLastError() = 18
FindClose(filefindhndl&)
print "Fertig!"
waitinput