c++ Größe einer Datei erkennen

toastie

Mitglied
Hallo Forum,

Ich würde gerne einen if-Befehl in mein c++-Programm schreiben, der schaut wie groß z. B. die datei test.exe ist, und wenn das dann

also z.B. : wenn test.exe gleich 20kb dann gib das aus.

Gibt es dafür einen Befehl? Danke im Vorraus:)

Gruss
 
Hallo Forum,

Ich würde gerne einen if-Befehl in mein c++-Programm schreiben, der schaut wie groß z. B. die datei test.exe ist, und wenn das dann

also z.B. : wenn test.exe gleich 20kb dann gib das aus.

Gibt es dafür einen Befehl?
Nein, nicht in Standard C/C++.

Das ist betriebssystemspezifisch. (zumindest die direkte Bestimmung der Dateigröße)

Und das Thema gab's hier mit Sicherheit schonmal. :suchen:

Gruß
 
Zuletzt bearbeitet:
Hallo,

ein einzelner Befehl ist es fast. Die untenstehende Variante sollte es sowohl in Linux als auch in Windows geben.
Code:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

struct stat sBuffer;
char* acFileName ="test.exe";
stat(acFileName, &sBuffer);
long lFileSize = sBuffer.st_size;

Die Dateigröße wird dabei in Bytes angegeben.
Der Buffer hat folgende Einträge:
Code:
         struct stat {
              dev_t     st_dev;     /* ID of device containing file */
              ino_t     st_ino;     /* inode number */
              mode_t    st_mode;    /* protection */
              nlink_t   st_nlink;   /* number of hard links */
              uid_t     st_uid;     /* user ID of owner */
              gid_t     st_gid;     /* group ID of owner */
              dev_t     st_rdev;    /* device ID (if special file) */
              off_t     st_size;    /* total size, in bytes */
              blksize_t st_blksize; /* blocksize for filesystem I/O */
              blkcnt_t  st_blocks;  /* number of blocks allocated */
              time_t    st_atime;   /* time of last access */
              time_t    st_mtime;   /* time of last modification */
              time_t    st_ctime;   /* time of last status change */
          };

Gruß,
muecke

P.S.: Das findet man auch ruck zuck im Internet. ;)
 
Hi
wie "deepthroat" schon sagte^^...
ich denke die Struktur stat würd dir weiterhelfen:

C++:
struct stat {
  dev_t  st_dev     /* Device, auf dem die Datei liegt */
  ushort st_ino     /* i-node-Nummer */
  ushort st_mode    /* Dateityp  */
  short  st_nlink   /* Anzahl der Links der Datei  */
  ushort st_uid     /* Eigentuemer-User-ID (uid)  */
  ushort st_gid     /* Gruppen-ID (gid)  */
  dev_t  st_rdev    /* Major- und Minornumber, falls Device */
  off_t  st_size    /* Größe in Byte  */
  time_t st_atime   /* Zeitpunkt letzter Zugriffs  */
  time_t st_mtime   /* Zeitpunkt letzte Änderung  */
  time_t st_ctime   /* Zeitpunkt letzte Statusänderung */
};

Die Funktion stat() (es gibt auch fstat()) liefert dir Informationen über eine Datei.
C++:
int  stat(char *dateiname,   struct stat *puffer);


Hier ein kleines Beispiel:

C++:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
   struct stat Status;
   int Dateityp;
   stat(argv[1], &Status);
   printf("Dateirechte: %o \n", Status.st_mode & ~S_IFMT);
   Dateityp = Status.st_mode & S_IFMT;
   switch (Dateityp) {
     case S_IFREG: puts("Datei"); break;
     case S_IFDIR: puts("Verzeichnis"); break;
     default: puts("Sonstiges");
   }
   printf("Dateigroesse: %d Bytes \n",Status.st_size);	
   system("pause");
   return 0;
}

Unter Windows.
Dasselbe müsste auch unter UNIX funktionieren soweit ich weiß gleicher Sruktur- Funktionsname jedoch envtl andere (nicht alle) Parameter.

EDIT: oh war wohl jemand schneller hatte das noch auf der Platte leigen von den anfängen wahrscheinlich selbe Quelle *G*
 
Zuletzt bearbeitet:
Danke euch allen:)Das hilft mir schonmal ein wenig weiter:)

@3Cyb3r

Das ist aber ein C-Quellcode oder?:)

€: Kann mir vllt mal einer einen Quellcode posten, der ungefähr das macht wie ich es ganz oben beschrieben habe? Denn mit diesen dort komme ich nicht so klar, aber ich denke, wenn ich eine Quellcode sehe, der ungefähr das macht wie ich es brauche, kann ich es besser verstehen:)
 
Zuletzt bearbeitet:
Hmm C/C++ sind nunmal verwandte Sprachen.
Viele Dinge sind einfach gleich 100% C++ funktionierend.
Ist wahrscheinlich C kompatibel.
 
€: Kann mir vllt mal einer einen Quellcode posten, der ungefähr das macht wie ich es ganz oben beschrieben habe? Denn mit diesen dort komme ich nicht so klar, aber ich denke, wenn ich eine Quellcode sehe, der ungefähr das macht wie ich es brauche, kann ich es besser verstehen:)
Ich nehme mal an, dass Du noch recht wenig Erfahrung in C/C++ hast. Meine Empfehlung, die ich auch meinen Studenten so gebe, schnapp Dir ein C/C++ Tutorial für Anfänger aus dem Internet (mit google Abertausende auffindbar) und probiere die dort gestellten Aufgaben auch selbst aus. Modifiziere die Beispiele, d.h. spiele einfach mal mit rum, so bekommst Du am besten ein Gefühl dafür. Es bringt glaube ich nichts, wenn wir Dir Deinen Quellcode schreiben.

Gruß,
muecke
 
Evtl. solltest du erst einmal C++ lernen -.-
Eine andere Möglichkeit wäre:
Schließe dich mit Sven Uwe zusammen ...

Aber da ich heut einen guten Tag habe ... :
(Ich weiß sowas sollte man nicht tuhen sonst kommen noch mehr Leute an XD kannst du mir diesen und jenen Quellcode posten)

C++:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char **argv)
{
    struct stat Status;
    stat("C://test.exe", &Status);
	printf("Dateigroesse: %d KB \n",Status.st_size/1000); 
    if((Status.st_size/1000) == 20)  // 1KB = 1000 Byte
		puts("bla");
	else
		puts("blub");
    system("pause");

    return 0;
}

MFG
Cyber
 
Hallo muecke,

Das habe ich schon gemacht. Bin zwar noch unerfahren aber wenn ich einen Quellcode sehe, der das tut was ich möchte, kann ich mich sehr gut dort hereindenken. Darum geht es mir:)

@3Cyb2r

Ich danke dir:)Ich versuche mich mal dort hereinzudenken un es ggf. zu modifizieren und zu erweitern:)
 
Zurück