CFileException::diskFull bei 28 GB noch frei



  • Falls mir jemand helfen möchte, schicke ich gerne eine Datei zum Ausprobieren rüber. (62 KB groß)
    Der Quellcode von oben steht einfach in der InitInstance - mehr macht die Exe nicht.

    Es passiert IMMER in der Selben Zeile. 😕



  • strZeile += _T("\n");

    Wenn man zu oft += bei CStrings hintereinander macht, kann es manchmal zu Problemen kommen.
    Kannst ja mal ausprobieren, ob es mit strcpy(...) und strcat(...) besser läuft.



  • Nochwas:
    Stimmt das überhaupt mit der while-Schleife ?
    Du fügst bei jedem Durchlauf etwas an und schreibst jedesmal den ganzen String weg ?
    Du willst doch bestimmt nur die gelesene Zeile schreiben, oder ?

    [rdit] Nach ein wenig nachdenken bin ich zu dem Schluss gekommen, dass du das hier vergessen kannst. 😃 [/edit]



  • Da ich die beiden Befehle nicht wirklich kann, habe ich das += einfach mal auskommentiert - es stürzt trotzdem ab. 😞
    (Hätte es funktioniert, würde ich jetzt MSDN lesen...)

    Nach 143 Zeilen (hab ich zählen lassen) passiert das. Ich habe schon versucht, das zwischen zu speichern, aber beim Flush (nach 100 Zeilen) und bei Close (statt Flush als Versuch) kriege ich auch den Fehler.

    Ich verstehe das nicht. 😕



  • Ja, ich will nur das gelesene schreiben - aber die TRACES die ich vor dem WriteString mache sehen okay aus. 🙂



  • @isabeau: Magst du das Programm mal ausprobieren? Ich komme auch mit Debuggen nicht weiter. Ich bin irgendwo in den Tiefen der MFC, verstehe den Quelltext gar nicht mehr und bin echt ratlos.

    Irgendwo in ...\vc98\ctr\src\write.c ist diese if und das geht schief.

    /* write the lf buf and update total */
                            if ( WriteFile( (HANDLE)_osfhnd(fh),
                                            lfbuf,
                                            q - lfbuf,
                                            (LPDWORD)&written,
                                            NULL) )
                            {
                                    charcount += written;
                                    if (written < q - lfbuf)
                                            break;
                            }
                            else {
                                    dosretval = GetLastError(); // das ist 5
                                    break;
                            }
    


  • estartu_de schrieb:

    Magst du das Programm mal ausprobieren?

    Hab ich schon.
    Ich habe einen 11 MB grossen Dump in *.imp umbenannt und eine leere Datei angelegt. Dann den Code in eine Buttonfunktion kopiert und gestartet.
    Nach etwa 40 Zeilen war strZeile dann leer und das Programm ist in den catch-Block gelaufen. Meine leere Zieldatei blieb leer.
    Dann habe ich die betreffende Zeile aus der Quelle gelöscht. Dann ist das Programm noch früher ausgestiegen (bei Zeile 16 ungefähr). Also habe ich mir eine 300-Zeilen-Textdatei erzeugt. In jeder Zeile ein Wort. Da rennt das Programm komplett durch, aber in der Zieldatei steht immernoch nix drin. Da steigt er aus, wenn er versucht, die Zieldatei zu schliessen -> rennt bei ziel.Close(); wieder in den catch-Block.



  • Ich schon wieder. 😃 Hab jetzt ziel.Open(strZiel, CFile::modeCreate)) in ziel.Open(strZiel, CFile::modeWrite)) geändert. Jetzt wird auch die Zieldatei geschrieben.
    Ausserdem habe ich meine Quelldatei auf 7232001 Zeilen und 45 MB aufgepumpt. Sind sogar Leerzeilen usw. drin. Das Programm läuft ohne Probleme. Hat deine Quelldatei eine Macke in der betreffenden Zeile ?



  • Also liegt es nichtmal an den Daten - hab ich so ein Brett vorm Kopf?

    Naja, momentan kämpfe ich mit Turbo Pascal 😃



  • So, wie es scheint hat VC++ verloren - ich habe das 1:1 in Turbo Pascal übersetzt und es läuft. 😕

    Langsam (wie man das von einem 486er erwartet), aber es funktioniert.
    Falls noch jemand eine Idee hat, wie man das unter VC++ zum Laufen bringt, wäre ich echt dankbar - immerhin läuft TP nicht auf jedem PC... 🙄


Anmelden zum Antworten