Größe einer mit ofstream bearbeiteten Datei



  • Hallo Leute,

    Ich möchte die Größe einer Datei (txt) bestimmen. Dafür habe ich eine Funktion, funzt auch gut.

    float FileSize(AnsiString astrFileNameForFileSize)
    {
      HANDLE hFile = CreateFile(astrFileNameForFileSize.c_str(),  // file to open
                           GENERIC_READ,          // open for reading
                           FILE_SHARE_READ,       // share for reading
                           NULL,                  // default security
                           OPEN_EXISTING,         // existing file only
                           FILE_ATTRIBUTE_NORMAL, // normal file
                           NULL);                 // no attr. template
    
        if (hFile == INVALID_HANDLE_VALUE)
        {
            ShowMessage("Error: Could not open file");
        }
        flSize = GetFileSize(hFile, NULL);
    
      return flSize;
    }
    

    Jetzt habe ich eine Textdatei in einem ofstream die in einer while-Schleife stetig um Werte erweitert wird. Jedoch möchte ich die Größenzunahme der Datei "überwachen" d.h. ausgeben.

    Quelltext:

    ifstream iStream(dateiName);                    // Datei öffnen
      ofstream tempStream("CharReplace_temp.txt");    // tempomäre Datei erstellen und öffnen
    
      while( getline(iStream, aktuelleZeile) )        // string aktuelleZeile
      {
        // macht hier ein paar lustige sachen 
        // und noch viel mehr ^^
    
        tempStream << aktuelleZeile << endl;        // in tempomäre Datei schreiben
    
        // hier möchte ich gerne die Größe der Datei "CharReplace_temp.txt" 
        // ausgeben lassen, sagen wir in eine Variable float flFileSize
        // jedoch geht flFileSize = FileSize("CharReplace_temp.txt"); nicht
        // sicher wegen hFile == INVALID_HANDLE_VALUE, denn der Stream ist ja noch  
        // an der Datei aktiv  
      }
    
      iStream.close();
      tempStream.close();
    
      // jetzt kann ich die Dateigröße wieder bestimmen, was nichts bringt, 
      // da alle Aktionen durchgeführt wurden, und die FileSize nun statisch ist
    

    Ihr kennt jetzt mein Konstrukt, meine Frage ist nun:
    Wie bekomme ich die Filesize bei jedem Druchlauf der while-Schleife?

    a) Ist es evlt möglich das Handle der Datei zu manipulieren ohne deren Inhalt zu zerstören, weil sie ja aktiv ist...
    b) kann man evtl ermiteln wie groß der Inhalt des Stream ist, und diesen dann stetig addieren?

    Ich danke für jede Idee,
    MfG
    Tippo





  • tausend dank!

    der Link ist gold wert!

    MfG
    Tippo



  • Wieso C? 🙄

    fstream hat auch eine Methode um die Position des Lese/Shcreibzeigers anzugeben.

    An deinem Beispiel:

    std::cout << tempStream.tellp() << std::endl;
    


  • ERstmal musst du in deiner filesize-funktion noch CloseHAndle aufrufen, sonst hast du irgendwann tausend offene handles auf deine Datei, das is nich gut.

    Weiterhin ist ofstsream gepuffert, also es werden nciht alle daten gleich in die datei geschrieben. Weiterhin weiß ich auch nich, ob man die größe messen kann, wenn ein anderer da grad reinschreibt.

    Eine Möglichkeit wäre, manuell mitzuzählen: Merk dir die größe am anfang, und zähl dann immer die länge der zeile zur größe hinzu und noch zwei byte für den zeilenumbruch.



  • The-Kenny schrieb:

    Wieso C? 🙄

    fstream hat auch eine Methode um die Position des Lese/Shcreibzeigers anzugeben.

    An deinem Beispiel:

    std::cout << tempStream.tellp() << std::endl;
    

    Das ist natürlich gut, dann muss ich nicht zurück zu C; so verwende ich es jetzt und es funtz gut --> besten Danke! 👍 👍 👍

    CloseHandle(hFile);
    

    Danke für den Tip, das hätte ich natürlich vergessen...

    MfG
    Tippo

    Edit: Sry, ich bau wieder nur Mist, natürlich CloseHandle, ich sollte echt besser aus dem Quelltext Kopieren, da passiert sowas nicht.



  • nicht Findclose... CloseHandle! steht ber auch in der msdn drin


Anmelden zum Antworten