我試圖使用stat(2)來確定argv [i]是否是常規文件,目錄或符號鏈接。有兩件事情,我不從stat(2)
man頁面瞭解:檢測文件類型(常規文件,目錄,符號鏈接等)
那是什麼
stat(2)
需要(即BUF ARG)int stat(const char *path, struct stat *buf);
如何使用第二個參數返回值以確定它是否是reg文件,dir或sym鏈接?
我試圖使用stat(2)來確定argv [i]是否是常規文件,目錄或符號鏈接。有兩件事情,我不從stat(2)
man頁面瞭解:檢測文件類型(常規文件,目錄,符號鏈接等)
那是什麼stat(2)
需要(即BUF ARG)
int stat(const char *path, struct stat *buf);
如何使用第二個參數返回值以確定它是否是reg文件,dir或sym鏈接?
要回答第一個問題,你可以取消引用stat
結構的實例和傳遞取消引用值stat()
來填充實例的字段值:
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
/* ... */
struct stat foo;
const char *path = "https://stackoverflow.com/a/b/c";
/* test the result of stat() to make sure it ran correctly */
if (stat(path, &foo) != 0) {
fprintf(stderr, "something went wrong with stat()\n");
exit(EXIT_FAILURE);
}
/* now do stuff with foo; e.g. from docs: */
switch (foo.st_mode & S_IFMT) {
case S_IFBLK: printf("block device\n"); break;
case S_IFCHR: printf("character device\n"); break;
case S_IFDIR: printf("directory\n"); break;
case S_IFIFO: printf("FIFO/pipe\n"); break;
case S_IFLNK: printf("symlink\n"); break;
case S_IFREG: printf("regular file\n"); break;
case S_IFSOCK: printf("socket\n"); break;
default: printf("unknown?\n"); break;
}
要回答第二個問題,從您鏈接到文件:
The following POSIX macros are defined to check
the file type using the st_mode field:
S_ISREG(m) - is it a regular file?
S_ISDIR(m) - directory?
S_ISCHR(m) - character device?
S_ISBLK(m) - block device?
S_ISFIFO(m) - FIFO (named pipe)?
S_ISLNK(m) - symbolic link? (Not in POSIX.1-1996.)
S_ISSOCK(m) - socket? (Not in POSIX.1-1996.)
的st_mode
場被填充,如果stat()
是成功的,那麼你可以通過這個結果上面列出的宏:
if (S_ISREG(foo.st_mode)) {
fprintf(stderr, "whatever foo points to is a regular file\n");
}
else {
fprintf(stderr, "whatever foo points to is something else\n");
}
你應該首先測試的stat()
結果,以確保您在st_mode
等領域都有可用值。再次參考文檔,該文檔實際上寫得很好,或者查看上面的代碼片段。
但我怎麼會使用這些宏給一些文件名argv [i]?謝謝 – Apollo 2014-08-30 20:38:35
再次給出文檔:'if(S_ISREG(foo.st_mode)){/ * blah * /}' – 2014-08-30 20:49:11
@Apollo:宏不接受文件名,它們必須與'struct st'成員一起使用' st_mode'。查看您鏈接到的頁面作爲示例。 – usr2564301 2014-08-30 20:49:16
什麼是downvote ... – Apollo 2014-08-30 20:38:53
該頁面說明了「返回值」的用途。像往常一樣,它表明成功或失敗。 – usr2564301 2014-08-30 20:41:30