2014-08-30 23 views
-2

我試圖使用stat(2)來確定argv [i]是否是常規文件,目錄或符號鏈接。有兩件事情,我不從stat(2) man頁面瞭解:檢測文件類型(常規文件,目錄,符號鏈接等)

  1. 那是什麼stat(2)需要(即BUF ARG)

    int stat(const char *path, struct stat *buf); 
    
  2. 如何使用第二個參數返回值以確定它是否是reg文件,dir或sym鏈接?

+0

什麼是downvote ... – Apollo 2014-08-30 20:38:53

+0

該頁面說明了「返回值」的用途。像往常一樣,它表明成功或失敗。 – usr2564301 2014-08-30 20:41:30

回答

4

要回答第一個問題,你可以取消引用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等領域都有可用值。再次參考文檔,該文檔實際上寫得很好,或者查看上面的代碼片段。

+0

但我怎麼會使用這些宏給一些文件名argv [i]?謝謝 – Apollo 2014-08-30 20:38:35

+1

再次給出文檔:'if(S_ISREG(foo.st_mode)){/ * blah * /}' – 2014-08-30 20:49:11

+0

@Apollo:宏不接受文件名,它們必須與'struct st'成員一起使用' st_mode'。查看您鏈接到的頁面作爲示例。 – usr2564301 2014-08-30 20:49:16

相關問題