GetLength - Problem
-
Hallo,
ich benutze zur Ermittlung von Dateigrößen die GetLength Funktion von CFile.
Das Problem ist nun, dass bei Dateien die größer als 4,2 GB sind, die Funktion an ihre Grenzen stößt.
Ich benutze nämlich noch VC++ 6.0 und hier hat die Funktion den Rückgabewert DWORD:DWORD CFile::GetLength() constWenn ich bei Microsoft in der MSDN reinschaue lese ich folgendes:
virtual ULONGLONG GetLength() const();Kann mir jemand sagen, was ich anstellen muss damit ich auch den Typ ULONGLONG zurückbekomme ????
Dank und Gruß
gorbo
-
Unter VC6 kannst Du Dir höchstens eine eigene Funktion schreiben. Hier mal die Implementation von MFC9:
ULONGLONG CFile::GetLength() const { ASSERT_VALID(this); ULARGE_INTEGER liSize; liSize.LowPart = ::GetFileSize(m_hFile, &liSize.HighPart); if (liSize.LowPart == INVALID_FILE_SIZE) if (::GetLastError() != NO_ERROR) CFileException::ThrowOsError((LONG)::GetLastError(), m_strFileName); return liSize.QuadPart; }
-
Oder mach es Dir einfach und steig auf VS-2008 um!
-
Erstmal vielen Dank für den Hinweis

Kannst du mir auch noch sagen wie ich denn diese Funktion überschreibe ?
Habe das noch nie gemacht. Wenn ich GetLength aufrufe soll ja dann die neue Funktion einspringen.Dank und Gruß
gorbo
-
Das ist etwas schwierig. Das Überschreiben mit gleichem Namen würde fehlschlagen, weil sich beide Funktionen nur im Rückgabewert unterscheiden.
Das einfachste wäre sicher, von CFile eine Klasse CFileEx abzuleiten und dort eine Methode GetLengthEx zu implementieren. Allerdings würde die MFC intern weiterhin nur die beschränkte CFile-Variante verwenden. Das könnte man nur mit einer eigenen MFC-Kompilierung umgehen. Aber das ist eher etwas für Fortgeschrittene.
Am besten aber wäre (wie Martin schon empfahl) der Umstieg auf VS 2008. Die MFC vom VC6 ist mittlerweile in vielen Punkten nicht mehr auf dem neuesten Stand.
-
sri schrieb:
Das ist etwas schwierig. Das Überschreiben mit gleichem Namen würde fehlschlagen, weil sich beide Funktionen nur im Rückgabewert unterscheiden.
Das ist doch für eine abgeleitete Klasse erlaubt!
Ist nur die Frage ob der VC6 Compiler das kapiert.
-
Stimmt. Aber ich glaube, so clever war er schon.

-
Hallo,
so clever bin ich wohl leider noch nicht

Habe aber mal in meiner MSDN geschaut und gesehen, dass GetFileSize mir auch ein DWORD zurückgibt. Wenn ich das denn richtig interpretiert habe.
Wenn ich das trotzdem mal testen möchte:
Muß ich das denn in meiner Klasse einfügen???
Dann müsste es ja eigentlich so aussehen:ULONGLONG MeineKlasse::GetLength() constDann hätte das aber ja nichts mehr mit CFile zu tun wie das Original?
ULONGLONG CFile::GetLength() const
-
Du musst eine Klasse von CFile (z.B. CMyCFile) ableiten, dort das GetLength() überschreiben und in Deinem Code statt
CFile file; ... file.GetLength();CMyFile file; ... file.GetLength();schreiben.
-
Erstmal vielen Dank für den Tip

Ist schon etwas länger her, als ich mal ne Klasse abgeleitet hatte.Funktioniert aber leider nicht, da der Compiler meckert das sich lediglich der Rückgabewert unterscheidet.
Habe daher die Funktion einfach umbenannt in GetBigLength()
Jetzt meckert er aber leider wie befürchtet an GetFileSize rum:
liSize.LowPart = ::GetFileSize(m_hFile, &liSize.HighPart);"Kovertierung des Parameters 1 von 'const unsigned int' in 'void*' nicht möglich"
Meine GetFileSize-Version sieht auch anders aus:
DWORD GetFileSize( HANDLE hFile, // handle to file LPDWORD lpFileSizeHigh // high-order word of file size );Werde dann wohl auf VS2008 umsteigen müssen. Dazu muss ich aber erstmal in die Kasse sehen, da die kostenlose Express-Version leider keine MFC enthält.
-
m_hFile ist in der MFC vom VC6 erstaunlicherweise als UINT und nicht als Handle definiert. Ein Cast sollte aber helfen:
liSize.LowPart = ::GetFileSize((HANDLE) m_hFile, &liSize.HighPart);
-
Vielen Dank für den genialen Tip. Hier einfach eine Typumwandlung anzuwenden wäre mir nicht mehr eingefallen....
Dank und Gruß

gorbo