Anzahl offene File Handles zählen
-
Hallo
Ich öffne Dateien mit fopen und schliesse sie wieder mit fclose. Irgendwann kann jedoch kein File mehr geöffnet werden, weil zuviele offene Files vorhanden sind. Ich bin der Meinung, das ich die Files immer wieder schliessen, aber offensichtlich geht was schief.
Gibt es irgend eine Möglichkeit, die Anzahl offener File Handles in meiner Applikation zu zählen?
Ich programmiere mit Microsoft Visual Studio unter Windwos XP, ohne MFC und dergleichen...
Danke.
Gruss
Hans
-
So als Schnellschuss:
int g_openFileHandles = 0; FILE *fopen_debug(const char *filename, const char *mode) { FILE *fp = fopen(filename, mode); if (fp) g_openFileHandles++; return fp; } void fclose_debug(FILE *fp) { if (fclose(fp) == 0) g_openFileHandles--; } //#ifndef NDEBUG # define fopen fopen_debug # define fclose fclose_debug //#endif int main (void) { FILE *fp = fopen("test.txt", "w"); FILE *fp1 = fopen("test1.txt", "w"); printf("%d\n", g_openFileHandles); fclose(fp); fclose(fp1); printf("%d\n", g_openFileHandles); } #undef fopen #undef fclose
-
Du könntest zum Testen eine RAII - Klasse ( http://de.wikipedia.org/wiki/RAII ) schreiben, die einen globalen Zähler beim Öffnen inkrementiert, beim Schließen dieser wieder dekrementiert.
Alternativ kannst du, wenn du wirklich viele Dateien öffnest und schließt, im Taskmanager die Anzahl der geöffneten Handles beobachten. Dazu mußt du unter "Ansicht - Spalten auswählen die Checkbox Handleanzahl (WinXp, bei anderen Versionen ähnlich) auswählen.
Ob du eine Datei wirklich dauerhaft geöffnet hälst, kannst du natürlich auch testen, indem du, während dein Programm läuft, versuchst, die Datei mit einem anderen Programm zu öffnen.
-
Ansonsten könntest Du auch die C++ IO Stream Klasse verwenden.

-
Das sollte praktisch sein

class File { public: File() { ++numOpenHandles; } ~File() { --numOpenHandles; } operator FILE*&() { return file_; } static size_t getNumHandles() { return numOpenHandles; } private: FILE* file_; static size_t numOpenHandles; }
-
De-Be schrieb:
Ansonsten könntest Du auch die C++ IO Stream Klasse verwenden.

Eben nicht... auch die C++ fstreams zählen gegen FILE_MAX (oder so), was wirklich hilft ist CreateFile aus der Win32 API.