我正在使用 gcc 32 位编译器。我使用stat()
了函数,但它没有提供有关文件类型的信息。有什么功能或方法可以找到所有这些吗?
问问题
3369 次
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_size
st_uid
struct stat
stat()
#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
您可以使用file
c 中提供的命令:
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 回答