Linux 目录操作的函数

来源:互联网 发布:知米听力 编辑:程序博客网 时间:2024/06/05 04:09

目录操作关键函数:
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存取错误

原创粉丝点击