Dateigröße von Systemdateien?



  • Hi Leute!

    Ich hab ein komisches Problem. Wenn ich eine Dateigrösse ermitteln will, mache ich

    FILE* workingfile = fopen("C:\\TEST.TXT", "rb");
    
    if(!workingfile)
    {
       MessageBox(NULL, "Vergiss es...", "", 0);
       exit(0);
    }
    fseek(workingfile, 0L, SEEK_END);
    
    char text [200];
    sprintf(text, "%d", (long) ftell(workingfile));
    MessageBox(NULL, text, "", 0);
    fclose(workingfile);
    

    Funktioniert wunderbar. Aber wenn ich versuche, die Grösse einer Systemdatei, wie z.B. (unter NT) C:\pagefile.sys, zu ermitteln, dann schlägt fopen() fehl. Warum, das? Gibt es eine Möglichkeit, auch die Dateigrösse von Systemdateien herauszufinden???

    Ich habs mal versucht mit GetFileSize() aus der WinAPI, aber bekomme das irgendwie net zum laufen, bzw. kapier ich nicht wie die geöffnet werden muss (da steht was von GENERIC_READ, OpenFile kennt aber lt. MSDN nur OF_READ...):

    OFSTRUCT fInfo;
    HFILE testfile = OpenFile("C:\\PAGEFILE.SYS", &fInfo, GENERIC_READ);
    DWORD size;
    size = GetFileSize(testfile, NULL); // <- hier nicht kompilierbar.
    CloseHandle(testfile);
    

    Grüsse,
    code_pilot 🙄



  • Du mußt die Datei mit CreateFile mit den Flags FILE_SHARE_READ und OPEN_EXISTING öffnen...

    Das HANDLE, was Du davon bekommst, kannst Du bei GetFileSize angeben...
    Hinterher das schließen mit CloseHandle nicht vergessen!

    Ob das bei der Auslagerungsdatei klappt (das öffnen), weiß ich nicht, da das Betriebssystem die Datei sicherlich geöffnet hat (weshalb fopen() sicherlich auch scheitert)...



  • hmmm ...

    danke erstmal. So geht es zwar mit anderen Dateien, aber bei PAGEFILE.SYS gibt die Funktion -1 zurück (kann wohl net geöffnet werden).

    OFSTRUCT fInfo;
    HFILE testfile = OpenFile("C:\\PAGEFILE.SYS", &fInfo, FILE_SHARE_READ | OPEN_EXISTING );
    DWORD size;
    size = GetFileSize((HANDLE)testfile, NULL);
    CloseHandle((HANDLE)testfile);
    


  • code_pilot schrieb:

    HFILE testfile = OpenFile("C:\\PAGEFILE.SYS", &fInfo, FILE_SHARE_READ | OPEN_EXISTING );
    

    Du sollst nicht OpenFile benutzen und den Rückgabewert casten, sondern CreateFile benutzen...

    Wer weiß was FILE_SHARE_READ | OPEN_EXISTING bei OpenFile anrichtet...



  • Schonmal stat versucht?
    (ist natürlich nicht WinAPI)

    http://wwwcgi.rdg.ac.uk:8081/cgi-bin/cgiwrap/wsi14/poplog/man/2/stat



  • Hepi schrieb:

    Du sollst nicht OpenFile benutzen und den Rückgabewert casten, sondern CreateFile benutzen...

    Wer weiß was FILE_SHARE_READ | OPEN_EXISTING bei OpenFile anrichtet...

    Upps da hab ich mich verlesen. Wie mach ich denn das? Bei dem hier kommt auch nur -1 bei rum. Was sind diese verschiedenen Parameter?

    HANDLE testfile = CreateFile ("C:\\PAGEFILE.SYS", GENERIC_READ,
         FILE_SHARE_READ, 0, OPEN_EXISTING,
               FILE_FLAG_SEQUENTIAL_SCAN, 0);
    DWORD size = GetFileSize(testfile, NULL);
    CloseHandle(testfile);
    

    Gruss,
    code_pilot





  • ja ach nee ... da hab ich auch schon geguckt aber keine brauchbare Antwort gefunden.



  • Sorry, aber du hattest eben gefragt was die verschiedenen Parameter sind - und das wird doch dort eigentlich erklärt. Um welche geht es denn genau bzw. was verstehst du nicht.



  • code_pilot schrieb:

    Upps da hab ich mich verlesen. Wie mach ich denn das? Bei dem hier kommt auch nur -1 bei rum. Was sind diese verschiedenen Parameter?

    Sowas passiert schonmal... 😉

    HANDLE testfile = CreateFile("C:\\PAGEFILE.SYS", GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    

    So würde ich eine Datei öffnen...
    Die Parameter sind ja in der MSDN recht exakt erklärt...

    Das "-1" bedeutet INVALID_HANDLE_VALUE

    MSDN schrieb:

    If the function fails, the return value is INVALID_HANDLE_VALUE. To get extended error information, call GetLastError.

    Was sagt denn GetLastError()?

    Vermutung:
    Wie bereits oben beschrieben, öffnet das Betriebssystem solche Dateien offenbar ohne FILE_SHARE_READ (also exklusiv), somit schlägt wahrscheinlich jeder Versuch, eine solche Datei ein zweites Mal zu öffnen, fehl...



  • Probier's doch mal mit FindFirst!

    Da wird auch die Groesse mit ausgelesen, ohne die Datei oeffnen zu muessen!


Anmelden zum Antworten