Dateigröße abfragen



  • Wie kann ich denn in C++ die größe einer Datei abfragen ?

    Also hab folgendes versucht:

    FILE *datei;
    
    	if( ( datei = fopen( "rofl.txt", "r+" ) ) == NULL )
    	{
    		return 10;		// Error 10 -> Datei existiert nicht.
    	}
    	else
    	{
    		printf ("Groesse: %d", sizeof( datei ));
    	}
    


  • Hi, soviel ich weiss, gehört das Bestimmen der Dateigröße nicht zum Sprachumfang von C++.

    Ich mache das jedefalls mit der stat - Funktion. Läuft bei mir unter Windows und unter Linux.

    #include <sys/stat.h> 
    
    int main(int argc, char *argv[])
    {
    	struct stat datei_infos;
    	char* pcDatei = "Deine Datei.dat";
    
    	if ( 0 != stat( pcDatei, &datei_infos ) )
    		cout << "Datei-Informationen konnten nicht gelesen werden." << endl;
    	else
    		cout << "Groesse in Byte: " << datei_infos.st_size << endl;
    
    return 0;
    }
    


  • Klar geht das auch mit Standard-Mitteln - Datei per fstream öffnen, mit seekg() ans Ende springen und anschließende mit tellg() die aktuelle Position abfragen.



  • CStoll schrieb:

    Klar geht das auch mit Standard-Mitteln

    Wie?

    Datei per fstream öffnen, mit seekg() ans Ende springen und anschließende mit tellg() die aktuelle Position abfragen.

    So jedenfalls nicht. tellg liefert ein streampos und damit keinen numerischen Wert. streampos kann zwar in ein streamoff konvertiert werden, allerdings definiert der Standard weder, ob ein streamoff einen numerischer Wert hat, noch welchen Typ streamoff besitzt (meistens long). Hinzukommend: ob die Konvertierung streampos -> streamoff implizit erfolgen kann ist ebenfalls nicht definiert.
    Und selbst wenn das alles klappt, dann garantiert dir immer noch keiner, dass der numerische Wert im streamoff irgendwas mit der Dateigröße zu tun hat (btw: was ist mit Dateigröße gemeint? Zahl der Bytes im FS, Zahl der Zeichen die gelesen werden können?...), könnte auch einfach ein Handle auf irgendeine interne DS sein.

    Und schließlich: auf den meisten 32-bit-Systemen ist der größte Standard-C++-Integer-Typ 4 Byte groß und kann somit keine Dateigrößen > 4 GB aufnehmen.



  • Stichwort: Boost.Filesystem



  • Ich hab da grade was in der MSDN gefunden:

    /* READ.C: This program opens a file named
     * READ.C and tries to read 60,000 bytes from
     * that file using _read. It then displays the
     * actual number of bytes read from READ.C.
     */
    
    #include <fcntl.h>      /* Needed only for _O_RDWR definition */
    #include <io.h>
    #include <stdlib.h>
    #include <stdio.h>
    
    char buffer[60000];
    
    void main( void )
    {
       int fh;
       unsigned int nbytes = 60000, bytesread;
    
       /* Open file for input: */
       if( (fh = _open( "read.c", _O_RDONLY )) == -1 )
       {
          perror( "open failed on input file" );
          exit( 1 );
       }
    
       /* Read in input: */
       if( ( bytesread = _read( fh, buffer, nbytes ) ) <= 0 )
          perror( "Problem reading file" );
       else
          printf( "Read %u bytes from file\n", bytesread );
    
       _close( fh );
    }
    

    Output

    Read 775 bytes from file

    😃 Sieht vielversprechend aus



  • @HumeSikkins
    So wie es ausschaut, ist seekg/tellg bytegenau RICHTIG (i.S.v. mc sagt dasselbe 😉
    stat oder auch file_size bringen stattdessen ein Vielfaches der Blockgröße - und zwar KLEINER als tellg, der letzte partielle Block wird nicht mitgezählt.



  • @Mike4455 Nur so am Rande: Der Thread darf mittlerweile schon Bier im Supermarkt kaufen 😁


Log in to reply