2

我正在使用 gcc 32 位编译器。我使用stat()了函数,但它没有提供有关文件类型的信息。有什么功能或方法可以找到所有这些吗?

4

5 回答 5

4

我相信您正在寻找 st_mode struct stat 成员。

从 stat(2) 联机帮助页:

     The status information word st_mode has the following bits:

 #define S_IFMT 0170000           /* type of file */
 #define        S_IFIFO  0010000  /* named pipe (fifo) */
 #define        S_IFCHR  0020000  /* character special */
 #define        S_IFDIR  0040000  /* directory */
 #define        S_IFBLK  0060000  /* block special */
 #define        S_IFREG  0100000  /* regular */
 #define        S_IFLNK  0120000  /* symbolic link */
 #define        S_IFSOCK 0140000  /* socket */
 #define        S_IFWHT  0160000  /* whiteout */
 #define S_ISUID 0004000  /* set user id on execution */
 #define S_ISGID 0002000  /* set group id on execution */
 #define S_ISVTX 0001000  /* save swapped text even after use */
 #define S_IRUSR 0000400  /* read permission, owner */
 #define S_IWUSR 0000200  /* write permission, owner */
 #define S_IXUSR 0000100  /* execute/search permission, owner */

sys/stat.h 还提供了以下用于测试文件类型的定义。您可以通过将 st_mode 的值作为参数传递来使用它们:

#define S_ISBLK(m)      (((m) & S_IFMT) == S_IFBLK)     /* block special */
#define S_ISCHR(m)      (((m) & S_IFMT) == S_IFCHR)     /* char special */
#define S_ISDIR(m)      (((m) & S_IFMT) == S_IFDIR)     /* directory */
#define S_ISFIFO(m)     (((m) & S_IFMT) == S_IFIFO)     /* fifo or socket */
#define S_ISREG(m)      (((m) & S_IFMT) == S_IFREG)     /* regular file */
#define S_ISLNK(m)      (((m) & S_IFMT) == S_IFLNK)     /* symbolic link */
#define S_ISSOCK(m)     (((m) & S_IFMT) == S_IFSOCK)    /* socket */
于 2013-08-19T16:30:22.803 回答
2

我使用了 stat() 函数,但它没有提供有关文件类型的信息。

不,stat()事实上给你所有你想要的文件。

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 */
};

所以如果你想要文件的类型,你可以使用st_mode信息。

您可以使用一些marco:(所有参数都是st_mode

 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.)

如果您想了解更多关于stat. 来这里

于 2013-08-19T16:51:54.317 回答
1

libmagic是您要查看的库,用于确定文件类型,而无需根据扩展名之类的东西进行猜测。这就是通用file命令的动力。

见: http: //linux.die.net/man/3/libmagic

它会(非常快速地)检查文件并向您返回文件的实际 MIME 类型,以及其他有用和有趣的内容。

于 2013-08-19T16:29:44.160 回答
0

uid并由作为成员size返回,并由成功调用.stat()st_sizest_uidstruct statstat()

#include <sys/stat.h>

...

struct stat s = {0};
int result = stat("somefilename", &s);
if (-1 = result)
  perror("stat() failed");
else
{
  printf("%u\n", s.st_uid); /* Print uid. */
  printf("%ld\n", s.st_size); /* Print size. */
}
于 2013-08-19T16:32:59.127 回答
-1

您可以使用filec 中提供的命令:

http://linux.die.net/man/1/file

从 bash(但可以在 ac 程序中运行):

 $ file file.c file /dev/{wd0a,hda}
 file.c:   C program text
 file:     ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV),
于 2013-08-19T16:21:43.430 回答