Größe einer Datei bestimmen (Nicht die auf dem Datenträger)



  • Hi!
    Ich möchte die Größe einer Datei bestimmen um sie einzulesen und in einem anderen Format zu speichern. In meinem Beispiel ist es eine Icon Datei.

    Daten:

    Größe: 2,18KB (2.238 Bytes)
    Größe auf Datenträger: 4,00KB (4.096 Bytes)

    ifstream ifl("icon.ico", ios::in|ios::binary);
    
      unsigned int ende;
      ifl.seekg(ios::end);
      ende = ifl.tellg();
      ifl.seekg(ios::beg);
    
      char *data = new char[ende];
    
      ifl.read((char*)data, ende);
    
      ifl.close();
    
      ofstream ofl("test.ico", ios::out|ios::binary);
    
      ofl.write((char*)data, ende);
    
      ofl.close();
    

    Nur bekomm ich als antwort für die Größe (hier "ende") immer 4.

    Wisst ihr wie ich an die andere Größe komme, oder ob es eine andere Möglichkeit gibt?
    In anderen Threads hier wird immer mit der Größe auf dem Datenträger gearbeitet...

    Thx 😃



  • Hallo,
    1. Was meinst du mit "Größe einer Datei"? Größe auf dem Datenträger bzw. im Dateisystem? Anzahl der Bytes die gelesen werden können? ...
    2. Standard-C++ bietet selbst keine Funktionen zur Abfrage von Dateiinformationen.
    3. Die Variante, die du in deinem Beispielcode verwendest, ist nicht portabel.
    4. Dein Aufruf von seekg ist falsch. seekg erwartet entweder einen Offset oder einen Offset und eine Richtung. Du verwendest die Richtung als Offset. Deshalb bekommst du auch immer den gleichen Wert bei tellg.
    Korrekt:

    ifl.seekg(0, ios::end);
    std::streampos p = ifl.tellg();
    


  • Ahh, das erklärt natürlich einiges. 😃
    Dummer zufall das die Größe grad die 4 betrug.
    Jetzt klappt es, Danke! 😃



  • 3. Die Variante, die du in deinem Beispielcode verwendest, ist nicht portabel.

    Warum und wo?



  • derderswissenwill schrieb:

    3. Die Variante, die du in deinem Beispielcode verwendest, ist nicht portabel.

    Warum und wo?

    Weil z.B. std::streampos weder ein Integer-Typ sein noch notwendigerweise die Anzahl der Bytes repräsentieren muss. Und selbst wenn beides zutriff, kann es Probleme geben. Typisches Beispiel: Dateien > 4 GB auf 32-bit Systemen.

    Generell sollte man für solche Dinge besser die BS-API verwenden oder eben eine Bibliothek, die selbige kapselt.



  • Klingt logisch, danke!


Anmelden zum Antworten