# c++ Größe einer Datei erkennen



## toastie (17. Februar 2010)

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


----------



## deepthroat (17. Februar 2010)

toastie hat gesagt.:


> 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
> 
> ...


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. 

Gruß


----------



## muecke (17. Februar 2010)

Hallo,

ein einzelner Befehl ist es fast. Die untenstehende Variante sollte es sowohl in Linux als auch in Windows geben.

```
#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:

```
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.


----------



## deepthroat (17. Februar 2010)

muecke hat gesagt.:


> P.S.: Das findet man auch ruck zuck im Internet.


Dann lass ihn doch mal suchen! Das größte Problem was die meisten hier haben, ist daß sie nicht suchen können.

Und so lernen sie es natürlich auch nicht.

Gruß


----------



## 3Cyb3r (17. Februar 2010)

Hi
wie "deepthroat" schon sagte^^...
ich denke die Struktur  stat würd dir weiterhelfen:


```
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.

```
int  stat(char *dateiname,   struct stat *puffer);
```


Hier ein kleines Beispiel:


```
#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*


----------



## toastie (17. Februar 2010)

Danke euch allenDas 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


----------



## 3Cyb3r (17. Februar 2010)

Hmm C/C++ sind nunmal verwandte Sprachen. 
Viele Dinge sind einfach gleich 100% C++ funktionierend.
Ist wahrscheinlich C kompatibel.


----------



## muecke (17. Februar 2010)

toastie hat gesagt.:


> €: 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


----------



## 3Cyb3r (17. Februar 2010)

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)


```
#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


----------



## toastie (17. Februar 2010)

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 dirIch versuche mich mal dort hereinzudenken un es ggf. zu modifizieren und zu erweitern


----------



## 3Cyb3r (17. Februar 2010)

Das Problem leigt eigl nun darin, dass die Funktion, wie schon gesagt wurde, nicht C++ Standart ist.
Ich empfehle eine eigene zu verwenden (für alle, die diesen Thread einmal lesen sollten auf der Suche nach Hilfe auch wenn ich bezweifle, dass diese Leute programmieren KÖNNEN)


```
FILE *f_file= fopen( "datei.dat", "r" );   //Datei öffnen  [r :: Öffnen ausschließlich zum Lesen]
if (!f_file)
	return -1;						       // Fehler beim öfnnen / Datei existiert nicht
fseek(f_file, 0, SEEK_END);                //Dateizeiger ans Ende setzen
size_t sz_file_size= ftell(f_file);        //Dateizeiger abfragen
fclose(f_file);  
	return sz_file_size;
```


----------



## Matthias Reitinger (17. Februar 2010)

3Cyb3r hat gesagt.:


> ```
> FILE *f_file= fopen( "datei.dat", "r" );     //Datei öffnen  [r :: Öffnen ausschließlich zum Lesen]
> if (!file)
> return -1;						// Fehler beim öfnnen / Datei existiert nicht
> ...


Abgesehen vom Tippfehler (f_file vs. file) funktioniert diese Methode aber nicht immer. Insbesondere, wenn der Benutzer keine Leserechte für die Datei besitzt.

Grüße,
Matthias


----------



## toastie (17. Februar 2010)

Ja ich hatte vor sowieso eine eigene Funktion zu verwenden, denn durch kopieren lernt man nichts

Aber es ist eine riesige Hilfe ein ich sag mal "Paradebeispiel" zu sehen und anhand diesem die Funktion überhaupt zu verstehen

Deshalb Danke


----------



## 3Cyb3r (17. Februar 2010)

Matthias Reitinger hat gesagt.:


> Abgesehen vom Tippfehler (f_file vs. file) funktioniert diese Methode aber nicht immer. Insbesondere, wenn der Benutzer keine Leserechte für die Datei besitzt.
> 
> Grüße,
> Matthias



Hmm da hast du wohl recht. Ich habe mich bislang noch nicht damit beschäftigt wie die Zugriffsrechte, die Sichtbarkeit u.v.m. von Dateien realisiert werden. 
Dann mach ein Vorschlag wie es ohne Leserechte geht so einfach lass ich dich nicht davonkommen ^^



toastie hat gesagt.:


> Ja ich hatte vor sowieso eine eigene Funktion zu verwenden, denn durch kopieren lernt man nichts
> 
> Aber es ist eine riesige Hilfe ein ich sag mal "Paradebeispiel" zu sehen und anhand diesem die Funktion überhaupt zu verstehen
> 
> Deshalb Danke



*3 faches Kopsfschütteln* ROFLMAO


----------



## toastie (17. Februar 2010)

warum rofl?

Ich tippe doch nicht blindlings drauflos und bekomme nichts auf die Reihe. Da hole ich mir doch lieber ein Beispiel, welches das tut was ich möchte un lerne anhand dessen wie die Funktion funktioniert und bastel dann eine eigene.


----------



## Matthias Reitinger (17. Februar 2010)

3Cyb3r hat gesagt.:


> Hmm da hast du wohl recht. Ich habe mich bislang noch nicht damit beschäftigt wie die Zugriffsrechte von Dateien realisiert werden.
> Dann mach ein Vorschlag wie es ohne Leserechte geht so einfach lass ich dich nicht davonkommen ^^


Lösungen, die keine Leserechte benötigen, wurden doch schon genannt (u.a. von dir). Am einfachsten ist es aber, wenn man eine Bibliothek verwendet, die Platformspezifisches wegabstrahiert.

Grüße,
Matthias


----------



## 3Cyb3r (17. Februar 2010)

Matthias Reitinger hat gesagt.:


> Lösungen, die keine Leserechte benötigen, wurden doch schon genannt (u.a. von dir). Am einfachsten ist es aber, wenn man eine Bibliothek verwendet, die Platformspezifisches wegabstrahiert.
> 
> Grüße,
> Matthias



Tja ich meine ohne Bibliothek. Das beste ist wenn man alles Grulegende einmal selbst zu Programmieren, dann versteht man es komplett und kann so später auch fehlerfrei fertige Methoden benutzen.
Bei gelengenheit werde ich das ganze einmal in Angriff nehmen momentan zuviel mit nem Roboter zutun -.-
Alos wem momentan langweilig ist  ...


----------

