我们知道C/C++都提供了标准的文件I/O库以便我们对文件进行读写。但我们无法通过标准的I/O库对文件系统进行更进一步的操作。因为这设计到具体操作系统中文件系统的设计。在Linux和Windows程序库下面都有一个sys目录,里面包含系统相关的头文件,如下:
Windows下:
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sys>dir
驱动器 C 中的卷是 wins
卷的序列号是 6C27-6F61
C:\Program Files\Microsoft Visual Studio 9.0\VC\include\sys 的目录
2013-08-26 22:50 <DIR> .
2013-08-26 22:50 <DIR> ..
2002-05-29 04:48 997 locking.h
2007-01-06 08:59 6,722 stat.h
2004-01-09 22:27 1,856 stat.inl
2007-01-06 08:59 3,139 timeb.h
2004-03-30 06:34 1,414 timeb.inl
2006-11-09 01:45 2,033 types.h
2007-01-06 08:59 3,805 utime.h
2004-11-13 22:45 2,881 utime.inl
2006-11-09 01:45 1,917 wstat.inl
9 个文件 24,764 字节
2 个目录 11,852,636,160 可用字节
Linux下面:
[anonymalias@localhost ~]$ ls /usr/include/sys
acct.h io.h ptrace.h stat.h ucontext.h
acl.h ipc.h queue.h statvfs.h uio.h
asoundlib.h kdaemon.h quota.h swap.h ultrasound.h
bitypes.h kd.h raw.h syscall.h un.h
cdefs.h klog.h reboot.h sysctl.h unistd.h
debugreg.h mman.h reg.h sysinfo.h user.h
dir.h mount.h resource.h syslog.h ustat.h
epoll.h msg.h select.h sysmacros.h utsname.h
errno.h mtio.h sem.h termios.h vfs.h
eventfd.h param.h sendfile.h timeb.h vlimit.h
fcntl.h pci.h shm.h time.h vt.h
file.h perm.h signalfd.h timerfd.h vtimes.h
fsuid.h personality.h signal.h times.h wait.h
gmon.h poll.h socket.h timex.h xattr.h
gmon_out.h prctl.h socketvar.h ttychars.h
inotify.h procfs.h soundcard.h ttydefaults.h
ioctl.h profil.h statfs.h types.h
我们可以看到在Windows和Linux下面的sys目录中都存在一个stat.h头文件,也是仅有的一个相同的文件。
Linux和Windows include目录下的sys/stat.h头文件都主要描述了对文件和目录的属性信息进行读取的操作。主要是通过struct stat结构体和stat()函数来实现的。在Windows的sys/stat.h头文件中的开头有下面一段说明:
/***
*sys/stat.h - defines structure used by stat() and fstat()
* Copyright (c) Microsoft Corporation. All rights reserved.
*Purpose:
* This file defines the structure used by the _stat() and _fstat()
* routines.
* [System V]
* [Public]
****/
可以看出该头文件遵循System V标准,所以Windows下的stat结构和Linux下面的基本属性都一致,所以下面主要以Linux下符合POSIX标准的stat进行介绍。
1 stat结构
stat结构如下(从linux的<bits/stat.h>中截取,成员类型名有所修改,主要是删除了有些下划线):
struct stat
{
dev_t st_dev; /* 设备编号(文件系统)*/
ino_t st_ino; /* 文件索引节点的编号 */
mode_t st_mode; /* 文件的类型和访问权限 */
nlink_t st_nlink; /* 硬链接计数*/
uid_t st_uid; /* 文件所有者的用户ID */
gid_t st_gid; /* 文件所有者的组ID*/
dev_t st_rdev; /* 设备编号(特殊文件) */
off_t st_size; /* 文件大小(B) */
blksize_t st_blksize; /* 块大小(文件系统的I/O 缓冲区大小,最佳I/O块大小) */
blkcnt_t st_blocks; /* 文件的块数*/
time_t st_atime; /* 最后访问时间*/
time_t st_mtime; /* 文件内容最后修改时间*/
time_t st_ctime /* 文件状态最后修改时间*/
};