12
votes

Utilisation de Struct Stat ()

J'essaie de comprendre comment utiliser exactement Stat () pour capturer des informations sur un fichier. Ce dont j'ai besoin, c'est d'être capable d'imprimer plusieurs domaines d'informations sur un fichier. Alors ..

 #include <iostream>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <fcntl.h>
 using namespace std;

 int main() {
     struct stat buf;
     stat("file",&buf);
               ...
     cout << st_dev << endl;
     cout << st_ino << endl;
     cout << st_mode << endl;
     cout << st_nlink << endl;
     cout << st_uid << endl;
     cout << st_gid << endl;
     cout << st_rdev << endl;
     cout << st_size << endl;
     cout << st_blksize << endl;
     cout << st_blocks << endl;
     cout << st_atime << endl;
     cout << st_mtime << endl;
     cout << st_ctime << endl;
     ...
 }


5 commentaires

Je vois, merci de tous pour les réponses. Ils étaient assez utiles. Est-ce que quelqu'un sait comment utiliser STDIN, STDOUT ou STDRERR comme paramètres à STAT fonctionne? Ce sont des flux et non des fichiers, alors comment les statistionnistes peuvent-elles remplir une structure avec des données?


Utilisez FSTAT , qui prend un descripteur de fichier comme premier argument au lieu d'un chemin.


Normalement, je ferais cela, mais l'environnement est quelque peu artificiel car il s'agit de la partie OS d'un simulateur architectural que j'ai écrit. Donc, lorsqu'un fichier est ouvert par un syscall, j'ai mon propre vecteur pour agir en tant que table descripteur de fichier. Y a-t-il un bon moyen de capturer le descripteur de fichier réel sur la machine pour un fichier tel qu'il est ouvert? Si tel était le cas, j'utiliserais FSTAT car aucune traduction ne serait requise entre les statistiques de flux et les statistiques de fichiers.


Vous devriez poser ces choses comme une question distincte alors plus de personnes peuvent les voir et de manière à ce qu'il y ait plus d'espace pour écrire que dans les commentaires.


Ça ira. Je n'étais pas sûr si c'était une question triviale ou non.


6 Réponses :


1
votes

Vous avez plusieurs erreurs dans votre code:

  • vous avez besoin & buf , avec un seul 'F'.
  • Vous devez dire par exemple. buf.st_dev Lors de l'impression, car st_dev est un champ de la variable de struct.

    Etant donné que buf est une variable locale sur la pile, vous ne "enregistrer pas les valeurs à la mémoire" de manière permanente, c'est aussi longtemps que cette variable est en mesure de la portée.

    Voici comment vous retournez plusieurs valeurs, généralement, en C et C ++. Vous passez un pointeur sur une structure et la fonction appelée remplit dans la structure avec les valeurs qu'il a calculées pour vous.


0 commentaires

14
votes

Oui, buf est utilisé ici sous forme de paramètre Out-Paramètre. Les résultats sont stockés dans buf et la valeur de retour de STAT est un code d'erreur indiquant si l'opération Stat a réussi ou échoué.

Il est fait de cette façon parce que STAT est une fonction POSIX, conçue pour C, qui ne prend pas en charge les mécanismes de rapport d'erreur hors bande tels que des exceptions. Si STAT retourné une structure, il n'aurait aucun moyen d'indiquer des erreurs. L'utilisation de cette méthode Out-Parameter permet également à l'appelant de choisir où elles souhaitent stocker les résultats, mais c'est une fonctionnalité secondaire. Il convient parfaitement à passer l'adresse d'une variable locale normale, tout comme vous l'avez fait ici.

Vous accédez aux champs d'une structure comme vous le feriez tout autre objet. Je présume que vous êtes au moins familier avec la notation d'objet? Par exemple. Le champ st_dev dans le STAT STRIT appelé BUF est accessible par buf.st_dev . Donc: xxx

etc.


0 commentaires

1
votes

buf est la structure que STAT chargee avec les informations sur le fichier que vous passez dans le premier paramètre. Vous passez & buf ici b / c Vous avez buf alloué sur la pile sous forme de variable locale et vous devez transmettre un pointeur sur la fonction STAT pour lui permettre de charger les données.

Toutes les variables de st _ * font partie de l'objet STR STAT. Il faut donc accéder via votre variable locale buf comme buf.st_uid , etc.


0 commentaires

4
votes

Pour un autre projet, j'ai fouillé une petite fonction qui fait quelque chose de similiaire à ce dont vous avez besoin. Jetez un coup d'œil à sprintstatf .

Voici un exemple d'utilisation: P>

#include <sys/stat.h>
#include <stdlib.h>
#include <stdio.h>

#include "sprintstatf.h"

int
main(int argc, char *argv[])
{
    char *outbuf = (char *)malloc(2048 * sizeof(char));
    struct stat stbuf;
    char *fmt = \
        "st_atime (decimal) = \"%a\"\n"
        "st_atime (string)  = \"%A\"\n"
        "st_ctime (decimal) = \"%c\"\n"
        "st_ctime (string)  = \"%C\"\n"
        "st_gid   (decimal) = \"%g\"\n"
        "st_gid   (string)  = \"%G\"\n"
        "st_ino             = \"%i\"\n"
        "st_mtime (decimal) = \"%m\"\n"
        "st_mtime (string)  = \"%M\"\n"
        "st_nlink           = \"%n\"\n"
        "st_mode  (octal)   = \"%p\"\n"
        "st_mode  (string)  = \"%P\"\n"
        "st_size            = \"%s\"\n"
        "st_uid             = \"%u\"\n"
        "st_uid             = \"%U\"\n";

    lstat(argv[1], &stbuf);

    sprintstatf(outbuf, fmt, &stbuf);
    printf("%s", outbuf);

    free(outbuf);
    exit(EXIT_SUCCESS);
}

/* EOF */


0 commentaires

2
votes

Cette question peut être une voie trop vieille à commenter, mais je pose cela comme une référence

Pour obtenir une bonne compréhension de la fonction Stat (), la raison de la transmission de la référence Stat et de la gestion des erreurs plus importante est-elle bien expliquée dans le lien ci-dessous

STAT - Obtenir le statut du fichier


0 commentaires

0
votes

Une chose similaire est avec la bibliothèque CTonne. Est conçu de la même manière. D'abord consiste à créer une structure vide. Vous avez accès à l'objet de la structure, mais tous les champs sont vides. Ensuite, vous utilisez cette fonction (& Nom-of-Create-OBIect) et est une ADRES au point d'obiect à l'extérieur de cette fonction. La fonction est conçue pour stocker toutes les informations à cette structure obiece à partir de référence donnée et Kaboom, vous avez obiect avec des données prêtes à utiliser.

Sinon, si vous ne voulez pas d'utiliser un pointeur, vous devez utiliser Obiect = fonction (null);

avec pointeur Fonction (& obiect);


0 commentaires