ERROR_INVALID_HANDLE GetFileTime



  • Hi,
    ich möchte mit GetFileTime die Ctime von einer Datei erhalten. Doch leider bekomm ich immer ERROR_INVALID_HANDLE.

    Teile aus dem Code:

    HANDLE hFind;	
    	FILETIME fctime;
    	SYSTEMTIME stime;
    
    	hFind = FindFirstFile(buffer, &FindFileData);
    
    	GetFileTime(hFind,&fctime,NULL,NULL);
    	FileTimeToSystemTime(&fctime,&stime);
    

    Warum erhalte ich nicht das Datum?

    Greetz



  • Weil Du den Rückgabewert von FindFirstFile nicht auswertest?



  • Tut mir leid, was meinst du? Vllt war der Codeauszug nicht gut gewählt. Hier ein bisschen mehr:

    hFind = FindFirstFile(buffer, &FindFileData);
    do{
    	if (wcscmp(FindFileData.cFileName, L".") != 0 && wcscmp(FindFileData.cFileName, L"..") != 0)
    	{
    		// Hier bau ich mir den kompletten Pfad zusammen.
    		// Dieser steht dann in einem wchar_t str[BUFFERSIZE]
    		if (attributes & FILE_ATTRIBUTE_DIRECTORY)
    		{
    			...
    				...
    		}
    		else
    		{
    			GetFileTime(hFind,&fctime,NULL,NULL);
    			FileTimeToSystemTime(&fctime,&stime);
    			...
    				...
    		}
    	}
    }while(FindNextFile(hFind, &FindFileData));
    

    "buffer" enthält den Pfad zum Verzeichnis.
    "str" den kompletten Pfad.

    Greetz


  • Mod

    Das FindFirstFile Handle ist ein "Handle für FindFirstFile/FindNextFile" und hat nichts mit einem Handle zu tun, das von CreateFile zurücgegebem wird.

    Du musst CreateFile ausführen um das Datei Handle zu bekommen!



  • Wobei: in FindFileData steht ja alles drin... warum willst Du das ganze nochmals auslesen, was Du eh schon hast?????



  • Du bist der Beste!
    Wenn ich folgendes einfüge,

    HANDLE fileinfo;
    fileinfo = CreateFile(str,GENERIC_READ,NULL,NULL,OPEN_EXISTING,NULL,NULL);
    

    funktionierst wunderbar. Muss ich CreateFile anwenden weil diese Funktion einen "open handle" zurückgibt und keinen "search handle"? Wo ist der Unterschied?

    Edit: Erhalte ich aus FindFileData das Datum?

    Greetz



  • Da Du im MFC-Forum fragst, weise ich mal auf die Klasse CFileFind hin.
    Darin gibt es u.a. so praktische Funktionen wie GetLastWriteTime() und auch IsDots(), IsDirectory(), ...



  • Taz_ schrieb:

    Muss ich CreateFile anwenden weil diese Funktion einen "open handle" zurückgibt und keinen "search handle"? Wo ist der Unterschied?

    Der Unterschied liegt hinter den Daten, die sich hinter diesen Handles verbergen. Genauso wenig kannst du Zeiger auf verschiedene Datentypen sinnvoll gegeneinander austauschen.

    Edit: Erhalte ich aus FindFileData das Datum?

    Ja, diese Struktur enthält einige nützliche Informationen über die gefundene Datei 😉



  • Wer einfach die Klasse CFileFind benutzt, die ja genau für diesen Zweck entwickelt wurde, muss sich weder um die WIN32_FIND_DATA Struktur, noch um irgendwelche Handles kümmern. Auch muss er das Handle, das CreateFile zurückgibt, nicht wieder schließen, woran der Benutzer Taz_ jetzt vermutlich gar nicht gedacht hätte, weil es ja so "wunderbar" funktioniert...


Anmelden zum Antworten