2017-10-14 11 views
0

Je veux savoir si un fichier est un répertoire ou un fichier régulier avec stat:stat st_mode est toujours égal à 16877

#define _DEFAULT_SOURCE 

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

int is_regular_file(const char *path) 
{ 
    struct stat path_stat; 
    stat(path, &path_stat); 
    return S_ISREG(path_stat.st_mode); 
} 

J'essaie sur Mac et Linux et quand j'imprimer S_ISREG (path_stat.st_mode) est toujours égal à 1 et path_stat.st_mode est toujours égale à 16877.

+0

La valeur '16877' est la combinaison des bits d'autorisation de fichier et des bits de mode de fichier (et quelques autres choses.) I.E. c'est une carte de bits et la macro 'S_ISREG' est simplement en train d'extraire un seul bit de ce champ de statistiques. Suggère de lire le fichier 'man' pour' stat'. – user3629249

Répondre

2

16877 est 40755 octal, qui désigne un répertoire (octal 40000) avec des autorisations 755 (utilisateur a tous les droits, tout le monde a lu et droits traversal). Comme suggéré, les pages de manuel stat et chmod sont utiles.

Juste par exemple, voici une capture d'écran avec mes directory-editor montrant les modes octal (une option) plutôt que les habituels symboles:

ded showing octal permissions

1

path_stat.st_mode est toujours égal à 16877

La valeur de st_mode doit être interprétée par bits:

Les 12 bits bas sont les autorisations d'accès aux fichiers que vous pouvez définir avec chmod. Chaque bit représente une autorisation de fichier. Les 4 bits élevés sont le type de fichier.

Les 12 bits faibles du nombre de 16 bits 16877 seraient 000111101101. Cette combinaison signifie:

---rwxr-xr-x (lire, écrire, exécuter pour le propriétaire du fichier, lire et exécuter pour les autres). Cette combinaison est typique pour les répertoires et pour les fichiers exécutables.

Les 4 bits hauts du nombre 16877 sont 4 qui (au moins sur Linux signifie): "Répertoire".

S_ISREG(path_stat.st_mode) est toujours égal à ...

La S_ISREG macro vérifie simplement si les 4 bits supérieurs de l'argument ont la valeur qui signifie: « Type de fichier est un fichier régulier. »

... est toujours égal à 1

Cela me confond un peu: 16877 devrait être un répertoire; cependant S_ISREG devrait retourner 1 pour les fichiers ordinaires et 0 pour toute autre chose (comme les répertoires). Lorsque la valeur renvoyée est `1`, il s'agit d'un fichier normal.