Allgemeine Fragen zur PROFAN Programmierung

Views (Heute): 240984 (2420)

| Suchen
| Zurück zur Übersicht

Autor | Thema: Findfirst über API
Bringfried Mohr
| Datum:26.07.02 16:24 (mohrbringfried@web.de) |
Hallo, ich nutze in einem Programm FindFirst über API. Hierzu habe ich einen Bereich mit Struct definiert, in dem u.a. das Erstellungsdatum enthalten ist, aber leider bekomme ich dieses irgendwie nicht in eine nutzbare Form. Die Struktur sieht wie folgt aus : Struct LPWIN32_FIND_DATA = dwFileAttributes&,ftCreationTime#(8), ftLastAccessTime#(8),ftLastWriteTime#(8), nFileSizeHigh&,nFileSizeLow&,dwReserved0&,\dwReserved1&,cFileName$(259),cAlternateFileName$(14) ! In glaube, ich muß die Daten erst noch umwandeln, aber wie ??? Ich muß noch dazu sagen, bei API-Programmierung stehe ich noch am Anfang. Der andere Teil des Progamms klappt wunderbar, aber der zweite Teil macht mir halt Kopfzerbrechen. Ich bin also für alle Hinweise offen ! Bringfried
Gerhard Putschalka
| Datum:28.07.02 09:45 (g.putschalka@utanet.at) |
Hallo Bringfried, (gibts den Namen wirklich?) hier ist ein Beispiel für die API Aufrufe. Da ich Profan 6.6 verwende konnte ich keine Strukturen über die Bereichsvariablen legen. Es sollte aber kein Problem sein diese zu definieren.
    ' Beispiel für FindFirstFile und FindNextFile. Für Profan 6.6
    ' Gerhard Putschalka 28.7.2002  g.putschalka@utanet.at (oder g.putschalka@web.de)

    Declare Datei$,Ret&,Hndl&,Found$
    Declare Ar1#,Ar2#

    DEF FFind(2)      ! "KERNEL32.DLL","FindFirstFileA"
    DEF FNext(2)      ! "KERNEL32.DLL","FindNextFileA"
    DEF FClose(1)     ! "KERNEL32.DLL","FindClose"

    Dim Ar1#,256   ' muß lang genug sein um die Suchmaske (+1 Stelle) aufzunehmen
    Dim Ar2#,256   ' die Länge 256 sollte genügen

    ' verschiedene Suchmasken
    Datei$ = "C:\\Windows\\*.bmp"
    'Datei$ = "C:\\Windows\\D*.*"
    'Datei$ = "C:\\Windows\\D?e*.*"

    Print "Suchbegriff:",Datei$
    Print

    ' setze den Suchbegriff in die Bereichsvariable für FindFirst
    String Ar1#,0 = Datei$

    ' suche erste Datei (nicht gefunden: Handle ist 0)
    Hndl& = @FFind(Ar1#,Ar2#) ' return ist der Handle
    Ret& = Hndl&

    ' Schleife solange Ret& > 0 (solange was gefunden wird)
    While (Ret& > 0)
       Print @String$(Ar2#,44)
       ' suche nächste Datei entsprechend der Suchmaske
       Ret& =@FNext(Hndl&,Ar2#)
    EndWhile

    ' FindFirst-Handle wieder schließen
    @FClose(Hndl&)
    Dispose Ar1#
    Dispose Ar2#
    Print
    Print "Ende mit linker Maustaste oder Enter"
    WaitInput
    End
Ich weiß nicht welche API Kenntnisse Du hast, daher noch folgende Informationen. In der API Doku (Win32.hlp) findest Du keinen Hinweis, daß die Aufrufe nicht FindFirstFileA (bzw. FindFirstFileW) und FindNextFileA (bzw. FindNextFileW) lauten. Normalerweise wird A und nicht W benutzt. Die verwendeten Parameterlisten sind: für FindFirstFileA HANDLE FindFirstFile( LPCTSTR lpFileName, // pointer to name of file to search for LPWIN32_FIND_DATA lpFindFileData // pointer to returned information ); für FindNextFileA BOOL FindNextFile( HANDLE hFindFile, // handle to search (found with FindFirstFileA) LPWIN32_FIND_DATA lpFindFileData // pointer to structure for data on found file ); in Profan wird, immer wenn "pointer" angegeben ist, eine Bereichsvariable benutzt. Ist dagegen, wie hier, "handle" angegeben wird eine LongInteger Variable benutzt. Die Struktur (die Aufteilung) der Bereichsvariablen für "lpFindFileData" sieht so aus: typedef struct _WIN32_FIND_DATA { // wfd DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; TCHAR cFileName[ MAX_PATH ]; TCHAR cAlternateFileName[ 14 ]; } WIN32_FIND_DATA; alle DWORDs sind LongIntegers (4-Bytes). TCHAR sind Strings, wobei hier die Länge nicht genau festgelegt ist. FILETIME sind eigene Strukturen mit je 8-Bytes. Daher ergibt sich, daß der gefundene Dateiname ab Stelle 45 gesetzt wird (4 + 8 + 8 + 8 + 4 + 4 + 4 + 4). Da bei Bereichsvariablen die erste Stelle mit 0 adressiert wird, ist der Dateiname daher auf Adresse 44 zu finden. Ich hoffe, Du kommst damit weiter. Für weitere Fragen schreib mir. Mfg. Gerhard.
Gerhard Putschalka
| Datum: 28.07.02 13:43 (g.putschalka@utanet.at) |
Noch ein Nachtrag. Ich habe übersehen, daß es Dir eigentlich um die Umrechnung des Datums ging. Auf meiner HP http://members.telering.at/g.putschalka/index.html gibt es unter Programme das Beispiel FileTime. Dort gibt es die Umrechnung des Datums aus der FileTime Struktur. Mfg Gerhard.

| Zurück zur Übersicht