第六章 文件与I/O(3)

文件与I/O

文件属性

stat

功能:
    通过文件名 filename 获取文件元信息,并保存在 buf 所指的结构体 stat 中 
原型:
    int stat(const char *path, struct stat *buf);
参数:
    path:文件的路径名
    buf:struct stat*
返回值:
    成功 : 0
    失败 : -1

fstat

功能:
    通过文件名 filename 获取文件元信息,并保存在 buf 所指的结构体
原型:        
    int fstat(int fd, struct stat *buf);
参数:
    path:文件描述符
    buf:struct stat*
返回值:
    成功 : 0
    失败 : -1

lstat

功能:
    通过文件名 filename 获取文件元信息,并保存在 buf 所指的结构体
原型:
    int lstat(const char *path, struct stat *buf);
参数:
    path:文件的路径名
    buf:struct stat*

返回值:
    成功 : 0
    失败 : -1

注意:
    当文件是一个符号链接时,lstat 返回的是该符号链接本身的信息;而stat 返回的是该链接指向的文件的信息。

stat结构体

struct stat { 
    dev_t         st_dev;       //文件的设备编号 
    ino_t         st_ino;       //节点 
    mode_t        st_mode;      //文件的类型和存取的权限 
    nlink_t       st_nlink;     //连到该文件的硬连接数目,刚建立的文件值为1 
    uid_t         st_uid;       //用户ID 
    gid_t         st_gid;       //组ID 
    dev_t         st_rdev;      //(设备类型)若此文件为设备文件,则为其设备编号 
    off_t         st_size;      //文件字节数(文件大小) 
    unsigned long st_blksize;   //块大小(文件系统的I/O 缓冲区大小) 
    unsigned long st_blocks;    //块数 
    time_t        st_atime;     //最后一次访问时间 
    time_t        st_mtime;     //最后一次修改时间 
    time_t        st_ctime;     //最后一次改变时间(指属性) 
};

示例

  • mysl1.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>

#define ERR_EXIT(m) \
        do  \
        {   \
            perror(m); \
            exit(EXIT_FAILURE); \
        }while(0)

#define MAJOR(a) (int)((unsigned short)a >> 8)
#define MINOR(a) (int)((unsigned short)a & 0xFF)

int filetype(struct stat* buf)
{
    int flag = 0;
    printf("File Type :");
    switch (buf->st_mode & S_IFMT)
    {
    case S_IFSOCK:
        printf("socket\n");
        break;
    case S_IFLNK:
        printf("symbolic link\n");
        break;
    case S_IFREG:
        printf("regular file\n");
        break; 
    case S_IFBLK:
        printf("block device\n");
        flag = 1;
        break; 
    case S_IFDIR:
        printf("directory\n");
        break;  
    case S_IFCHR:
        printf("character device\n");
        flag = 1;
        break;  
    case S_IFIFO:
        printf("FIFO\n");
        break;  

    default:
        printf("unkonwn\n");
        break;
    }
    return flag;
}

void fileperm(struct stat *buf, char *p)
{
    strcpy(p,"----------");
    p[0] = '?';

    switch (buf->st_mode & S_IFMT)
    {
    case S_IFSOCK:
        p[0] = 's';
        break;
    case S_IFLNK:
        p[0] = 'l';
        break;
    case S_IFREG:
        p[0] = '-';
        break; 
    case S_IFBLK:
        p[0] = 'b';
        break; 
    case S_IFDIR:
        p[0] = 'd';
        break;  
    case S_IFCHR:
        p[0] = 'c';
        break;  
    case S_IFIFO:
        p[0] = 'p';
        break;  
    }

    if(buf->st_mode & S_IRUSR)
        p[1] = 'r';
    if(buf->st_mode & S_IWUSR)
        p[2] = 'w';
    if(buf->st_mode & S_IXUSR)
        p[3] = 'x';
    if(buf->st_mode & S_IRGRP)
        p[4] = 'r';
    if(buf->st_mode & S_IWGRP)
        p[5] = 'w';
    if(buf->st_mode & S_IXGRP)
        p[6] = 'x';
    if(buf->st_mode & S_IROTH)
        p[7] = 'r';
    if(buf->st_mode & S_IWOTH)
        p[8] = 'w';
    if(buf->st_mode & S_IXOTH)
        p[9] = 'x';
    p[10] = '\0';    
}

int main(int argc, char* argv[])
{
    printf("MAJOR : %d\n",MAJOR(65280));
    printf("MINOR : %d\n",MINOR(65280));

    
    struct stat sbuf;
    if(argc != 2)
    {
        fprintf(stderr, "Usage %s file\n",argv[0]);
        exit(EXIT_FAILURE);
    }

    printf("filename : %s\n",argv[1]);
    if(stat(argv[1], &sbuf) == -1)
        ERR_EXIT("stat error");   

    //
    //df 文件名 

    printf("MAJOR : %d  MINOR : %d\n",MAJOR(sbuf.st_dev),MINOR(sbuf.st_dev));
    printf("inode number : %lu\n",sbuf.st_ino);
    printf("protection : %u\n",sbuf.st_mode);
    printf("number of hard links : %lu\n",sbuf.st_nlink);
    printf("user ID of owner : %u\n",sbuf.st_uid);
    printf("group ID of owner : %u\n",sbuf.st_gid);
    printf("device ID of owner : %lu\n",sbuf.st_rdev);
    printf("total size : %lu\n",sbuf.st_size);
    printf("blocksize for filesystem I/O : %lu\n",sbuf.st_blksize);
    printf("number of 512B blocks allocated : %lu\n",sbuf.st_blocks);
    printf("time of last access : %lu\n",sbuf.st_atime);
    printf("time of last modification : %lu\n",sbuf.st_mtime);
    printf("time of last status change : %lu\n",sbuf.st_ctime);


    if(filetype(&sbuf))
    {
        printf("MAJOR : %d  MINOR : %d\n",MAJOR(sbuf.st_dev),MINOR(sbuf.st_dev));
    }
    printf("File permission bits : %o\n",sbuf.st_mode & 0777);

    struct passwd *pw,*pw1;
    char perm[11] = {0};
    char pszTime[40] = {0};

    struct tm *tmTime;
    tmTime = localtime(&sbuf.st_mtime);
    strftime(pszTime,sizeof(pszTime),"%m月 %d %H:%M",tmTime);
    //sprintf(pszTime,"%d月  %d %d %d",(*tmTime).tm_mon+1, (*tmTime).tm_mday, (*tmTime).tm_hour, (*tmTime).tm_min);

    fileperm(&sbuf,perm);
    pw = getpwuid(sbuf.st_uid);
    pw1 = getpwuid(sbuf.st_gid);

    printf("File permission : \n%s %lu %s %s %lu  %s %s\n",perm, sbuf.st_nlink, pw->pw_name, pw1->pw_name, sbuf.st_size, pszTime, argv[1]);

    

    return 0;
}

文件属主

chown

功能说明:
    用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:
    int chown(const char *path, uid_t owner, gid_t group);
参数:
    path : 文件的路径名
    owner : 所有者识别号
    group : 用户组识别号
返回值:
    成功 : 0
    失败 : -1

lchown

功能说明:
    用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:
    int lchown(const char *path, uid_t owner, gid_t group);
参数:
    path : 文件的路径名
    owner : 所有者识别号
    group : 用户组识别号
返回值:
    成功 : 0
    失败 : -1
注意:
    lchown 与 chown 类似,但是 lchown 改变的是链接文件本身的权限,与链接所值的文件无关

fchown

功能说明:
    用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:
    int fchown(int fd, uid_t owner, gid_t group);
参数:
    fd : 文件描述符
    owner : 所有者识别号
    group :用户组识别号

返回值:
    成功 : 0
    失败 : -1

文件权限

chmod 和 fchmod

功能:
    用来改变给定路径名 pathname 的文件的权限位
原型:
    int chmod(const char *path, mode_t mode);
参数:
    pathname : 文件的路径名
    mode : 权限位
返回值:
    成功 : 0
    失败 : -1
功能:
    用来改变给定路径名 pathname 的文件的权限位
原型:
    int fchmod(int fd, mode_t mode);
参数:
    fd : 文件描述符
    mode : 权限位    
返回值:
    成功 : 0
    失败 : -1
posted @ 2019-08-09 10:56  sfdevs  阅读(41)  评论(0)    收藏  举报