ReadFile gibt aus, eine Datei wäre leer
-
Hallo,
vor kurzem habe ich von MinGW zu VC++(wenn man das so sagen kann) gewechselt. Nun hatte ich mir, da GetFileSizeEx auf einigen Rechnern nicht zu funktionieren scheint, ein kleines Stück Code zum ermitteln der Länge des Inhalts einer Datei geschrieben. Hat auch hervorragend funktioniert. Nur leider funktioniert das ganze jetzt unter Visual Studio Express 2013 nicht mehrDWORD fileSize = 0; readedBytes = 1024; while(readedBytes == 1024) { char buffer[1024]; if(!ReadFile(hFile, buffer, sizeof buffer / sizeof *buffer - 1, &readedBytes, 0)) { lastError = *getReadableErrorMessage(); return false; } readedBytes += 1; fileSize += readedBytes; }
Das ganze returnt nicht false, jedoch ist der Wert von fileSize == 1(was nicht stimmt). Hat jemand eine Idee, woran das liegen könnte? Danke schon mal
MfG
DragonRaiderPS.: Der Pfad stimmt auch
-
DragonRaider schrieb:
...Code zum ermitteln der Länge des Inhalts einer Datei geschrieben. Hat auch hervorragend funktioniert. Nur leider
funktioniert das ganze jetzt unter Visual Studio Express 2013 nicht mehrDWORD fileSize = 0; readedBytes = 1024; while(readedBytes == 1024) { char buffer[1024]; if(!ReadFile(hFile, buffer, sizeof buffer / sizeof *buffer - 1, &readedBytes, 0)) { lastError = *getReadableErrorMessage(); return false; } readedBytes += 1; fileSize += readedBytes; }
Das ganze returnt nicht false, jedoch ist der Wertvon fileSize 1(was nicht stimmt).
Mal abgesehen davon das wichtige Teile, wie das Öffnen der Datei, fehlen kann die Länge insgesammt nicht stimmen,
da bei jedem Durchlauf readedBytes zusätzlich um 1 erhöht wird.Wenn ReadFile bei dir 0 Bytes liest ist wohl was schiefgegangen.
Was kommt bei GetLastError() heraus und wie wird die Datei genau geöffnet ?
Wenn nur die Groesse der Datei ermittelt werden soll, warum dann nicht GetFileSize() ?
-
Hi,
danke schon mal für deine Hilfe.
Da ich auf die Idee mit GetLastError() auch schon gekommen war, hatte ich mir den Output davon auch schon mal angesehen. Dachte ich ^^ es stellte sich nämlich soeben heraus, dass ich die von mir deklariert getLastError() aufgerufen hatte. GetLastError() gibt 6 zurück.
Warum ich nicht FileSize() benutze steht bereits im obigem Post.
Das += 1 habe ich drin, da wenn ReadFile() volle 1024 Bytes liest, es 1023 zurück gibt, wahrscheinlich aufgrund der Tatsache, dass Array-Indexe mit 0 anfangen(oder ich habe was falsch gemacht :D).
Hier der Code zum Öffnen der Datei:HANDLE hFile = CreateFile((LPCWSTR)path, GENERIC_READ, 0, 0, OPEN_ALWAYS, 0, 0); if(hFile == INVALID_HANDLE_VALUE) { lastError = *getReadableErrorMessage(); return false; }
wobei der Wert vom
LPCSTR path
stimmt.
Danke noch mal.
MfG
DragonRaiderEdit 1: Ein paar Rechtsschreibfehler gefixt
Edit 2: Der Errorcode steht für:
ERROR_INVALID_HANDLE
-
DragonRaider schrieb:
... da GetFileSizeEx auf einigen Rechnern nicht zu funktionieren scheint, ...
Aha?
-
Hi,
jetzt habe ich u.U. das Problem "verändert": Error Code bleibt der gleiche, nur gibt ReadFile() jetzt auch false zurück
Neuer Code:OVERLAPPED IAmNotSureWhatThisDoes = { 0 }; IAmNotSureWhatThisDoes.hEvent = CreateEvent(NULL, true, false, NULL); DWORD fileSize = 0; readedBytes = 1024; while(readedBytes == 1024) { char buffer[1024]; if(!ReadFile(hFile, buffer, sizeof buffer / sizeof *buffer - 1, &readedBytes, &IAmNotSureWhatThisDoes)) { lastError = *getReadableErrorMessage(); return false; } readedBytes += 1; fileSize += readedBytes; }
MfG
DragonRaiderEdit 1: Scheine noch nicht richtig in der Materie drin zu sein
habe jetzt den richtigen Error Code: 38. Ich werde jetzt mal ein bisschen im Internet suchen und wen ich die Lösung gefunden habe hier noch mal posten. Vielen Dank!
Edit 2: Zu früh gefreut... ReadFile gibt wegen EOF false zurück? Zumal da eigentlich gar kein EOF ist
Mal gucken, ob vielleicht meine Dateien beschädigt sind.
Edit 3: Sind sie "leider" nicht
Edit 4: Dieser "Fix", den ich beim googlen gefunden hatte, hat den Error Code verursacht... Das ganze entfernt, GetLastError() == 0, trotzdem 0 Bytes gelesen :p
-
blob! schrieb:
DragonRaider schrieb:
... da GetFileSizeEx auf einigen Rechnern nicht zu funktionieren scheint, ...
Aha?
Ich habe das ganze mal an einem Windows XP SP 3 Rechner in unserer Schule getestet, was dort zum Programmabsturz geführt hat, an meinem Windows 7 PC jedoch nicht. Wie auch immer: später wird die Datei sowieso u.U. auch noch eingelesen, spätestens dann würde das Problem wieder auftreten ^^
MfG
DragonRaider
-
LPCSTR path = …; HANDLE hFile = CreateFile((LPCWSTR)path, … bla blubb …);
Das kann doch gar nicht gut gehen! Bitte sag mir, dass path nicht vom Typ LPCSTR ist. Ansonsten: entferne den Cast und konvertiere den String ordentlich in einen Widestring und nicht mit der Brechstange.
-
Deswegen wohl auch
DragonRaider schrieb:
... was dort zum Programmabsturz geführt hat ...
1. Grundlagen
2. WinAPI:p
-
Hi,
danke für eure Hilfe. Ich habe ehrlich gesagt nicht weiter über den Cast nach gedacht, mal sehen, ob es das ganze fixt. Was ich mich nur die ganze Zeit frage: Warum hatte ich bei diesem Cast unter MinGW keine Probleme
MfG
DragonRaider
-
Sooo, jetzt benutze ich ganz einfach CreateFileA(), klappt hervorragend, vielen Dank!
-
es ist trotzdem sinnlos GetFileSizeEx nicht zu verwenden...