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 mehr 😞

    DWORD 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
    DragonRaider

    PS.: 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 mehr 😞

    DWORD 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
    DragonRaider

    Edit 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
    DragonRaider

    Edit 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...


Anmelden zum Antworten