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 istIhr 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
-
http://www2.informatik.uni-halle.de/lehre/c/c_fopen.html
siehe fseek + ftell
-
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
TippoEdit: 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