目录操作关键函数:
opendir
readdir
closedir
S_ISDIR
mkdir
rmdir
chdir
getcwd
stat取得文件状态
struct stat
{
dev_t st_dev; /*device*/
ino_t st_ino; /*inode*/
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 type (if inodedevice)*/
off_t st_size; /*total size, in bytes*/
unsigned long st_blksize; /*blocksize for filesystem I/O*/
unsigned long st_blocks; /* number of 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 change*/
};
st_dev 文件的设备编号
st_ino 文件的i-node
st_mode 文件的类型和存取的权限
st_nlink 连到该文件的硬连接(hard link)数目, 刚建立的文件值为1
st_uid 文件所有者的用户识别码(user ID)
st_gid 文件所有者的组识别码(group ID)
st_rdev 若此文件为装置设备文件,则为其设备编号
st_size 文件大小,以字节计算
st_blksize 文件系统的I/O缓冲区大小
st_blocks 占用文件区块的个数,每一区块大小为512个字节
st_atime 文件最近一次被存取或被执行的时间,一般只有在用mknod, utime, read, write 与 truncate时改变
st_mtime 文件最后一次被修改的时间,一般只有在用mknod, utime 和 write时才会改变
st_ctime i-node最近一次被更改的时间,此参数会在文件所有者、组、权限被更改时更新
st_mode定义的情况
S_IFMT 0170000 文件类型的位遮罩
S_IFSOCK 0140000 socket
S_IFLNK 0120000 符号连接(symbolic link)
S_IFREG 0100000 一般文件
S_IFBLK 0060000 区块装置(block device)
S_IFDIR 0040000 目录
S_IFCHR 0020000 字符装置(character device)
S_IFIFO 0010000 先进先出(fifo)
S_ISUID 0004000 文件的(set user-id on execution) 位
S_ISGID 0002000 文件的(set group-id on execution)位
S_ISVTX 0001000 文件的sticky位
S_IRWXU 00700 文件所有者的遮罩值(即所有权限值)
S_IRUSR 00400 文件所有者具可读取权限
S_IWUSR 00200 文件所有者具可写入权限
S_IXUSR 00100 文件所有者具可执行权限
S_IRWXG 00070 用户组遮罩值
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IRWXO 00007 其他用户的遮罩值(即所有权限值)
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写权限
S_IXOTH 00001 其他用户具可执行权限
上述的文件类型在POSIX中定义了检查这些类型的宏定义:
S_ISLNK(st_mode) 判断是否为符号连接
S_ISREG(st_mode) 是否为一般文件
S_ISDIR(st_mode) 是否为目录
S_ISCHR(st_mode) 是否为字符装置文件
S_ISBLK(s3e) 是否为先进先出(fifo)
S_ISSOCK(st_mode) 是否为socket
若一目录具有sticky位(S_ISVTX), 则表示在此目录下的文件只能被该文件所有者、此目录所有者或root来删除(delete)或改名(rename)
返回值: 执行成功返回0, 失败返回-1, 错误代码存于errno
错误代码:ENOENT 参数file_name指定的文件不存在
ENOTDIR 路径中的目录存在但却非真正的目录
ELOOP 欲打开的文件有过多符号连接问题,上限为16符号连接
EFAULT 参数buf为无效指针,指向无法存在的内存空间
EACCESS 存取文件时被拒绝
ENOMEM 核心内存不足
ENAMETOOLONG 参数file_name的路径名称太长
chomd更改文件权限
#include <sys/types.h>
#include <sys/stat.h>
int chmod(const char *path,mode_t mode);
=====================================================
chmod()依参数mode权限来更改参数path指定文件的权限
=====================================================
mode值
S_ISUID 04000 文件的(set user-id on execution)位
S_ISGID 02000 文件的(set group-d on execution)位
S_ISVTX 01000 文件的sticky位
S_IRUSR (S_IREAD) 00400 文件所有者可读取权限
S_IWUSR(S_IWRITE) 00200 文件所有者具可写入权限
S_IXUSR(S_IEXEC) 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可写入权限
S_IWOTH 00002 其他用户具可读权限
S_IXOTH 00001 其他用户具执行权限
只有该文件的所有者(owner)或有效用户识别码(effective UID)为0,才可以修改文件权限。基于系统安全,如果欲将数据写入一执行文件,而该执行文件具有S_ISUID或S_ISGID权限,则这两个位会被清 除。如果一目录具有S_ISVTX位权限,表示在此目录下只有该文件的所有者或root可以删除该文件(如/tmp)
返回值: 成功改为0
失败改为-1
错误原因存在于errno
错误代码:
EPERM 进程的有效用户识别码与欲修改权限的文件拥有者不同,而且也不是root权限
EACCESS 参数path所指定的文件无法存取
EROFS 欲写入权限的文件存在于只读文件系统内
EFAULT 参数path指针超出可存取内存空间
EINVAL 参数mode不正确
ENAMETOOLONG 参数path太长
ENOENT 指定的文件不存在
ENOTDIR 参数path路径并非一目录
ENOMEM 核心内存不足
ELOOP 参数path有过多符号连接问题
EIO I/O存取错误