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
Antwort
Ich wollte nichts anderes verwenden, wie zu lesen und zu schreiben, fand ich, dass der Fehler bei Verwendung read() nicht durch open()
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 */
};
Die Verwendung von 'stat()' anstelle von 'fstat()' eröffnet eine mögliche Zeit für die Überprüfung im Vergleich zur Nutzungszeit (TOCTOU). – EOF
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.
Verwendung zurückgegeben wird 'fstat()' auf dem Datei-Deskriptor bekommen Sie von 'open()'? – EOF
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. –
Denken Sie immer an die Unix-Philosophie: "Alles ist eine Datei". – Olaf