2016-07-21 12 views
0

Ich habe eine Funktion, die Datei öffnet dann lesen Sie diese Dateien, mit den Standardfunktionen open() und read(). Ich benutze die errno-Variablen für alle möglichen Fehler, wie die verweigerte Berechtigung oder keine solche Datei oder dieses Verzeichnis, aber wenn ich open für ein Verzeichnis verwende, gibt es keinen Fehler zurück, sondern öffne es einfach und versuche es zu lesen. Also wie bekomme ich eine Fehlermeldung wenn ich ein Verzeichnis öffne?C open() Verzeichnis kein Fehler

+1

Verwendung zurückgegeben wird 'fstat()' auf dem Datei-Deskriptor bekommen Sie von 'open()'? – EOF

+1

Ein Codebeispiel würde die Annahme unterbinden, unter der ich eine Antwort gebe ... weil errno nicht durch die open-Funktion initialisiert wird, noch wird es geändert, wenn es erfolgreich zurückkehrt; errno wird nur gesetzt, wenn ein Fehler auftritt. Es liegt an Ihnen, errno vor dem Aufruf von open() zu setzen, wenn Sie das tun müssen. –

+1

Denken Sie immer an die Unix-Philosophie: "Alles ist eine Datei". – Olaf

Antwort

0

Ich wollte nichts anderes verwenden, wie zu lesen und zu schreiben, fand ich, dass der Fehler bei Verwendung read() nicht durch open()

2

Verzeichnis ist auch eine Datei (in Bezug auf Unix/Linux). Im Allgemeinen erhalten Sie keinen Fehler. Sie können stat oder fstat Funktion für die Verfolgung von gewöhnlichen oder speziellen Dateien verwenden.

Wenn Sie entweder stat oder fstat verwenden, müssen Sie eine struct stat-Variable wie struct stat var deklarieren. Die Struktur stat hat ein Element namens st_mode, das die Information darüber enthält, um welche Art von Datei es sich handelt.

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 file system I/O */ 
    blkcnt_t st_blocks; /* number of 512B 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 */ 
}; 
+0

Die Verwendung von 'stat()' anstelle von 'fstat()' eröffnet eine mögliche Zeit für die Überprüfung im Vergleich zur Nutzungszeit (TOCTOU). – EOF

1

Verzeichnis auch eine Datei in Unix *, wenn Sie ein Verzeichnis von open() zu öffnen, um vermeiden möchten, müssen Sie den Dateityp überprüfen. Wie @ nayabbashasayed sagen, können Sie die stat verwenden, um den Dateityp und weitere Informationen zu überprüfen.

Hier ist ein Beispielcode die Art von stat zu überprüfen:

const char *filePath; 
struct stat fileStatBuf; 
if(stat(filePath,&fileStatBuf) == -1){ 
    perror("stat"); 
    exit(1); 
} 

/* 
*You can use switch to check all 
*the types you want, now i just use 
*if to check one. 
*/ 
if((fileStatBuf.st_mode & S_IFMT) == S_IFDIR){ 
    printf("This type is directory\n"); 
} 

Hoffnung, die Ihnen helfen können.