• 第4章 文件和目录(1)_文件属性及文件类型


    1. 文件属性及文件类型

    (1)文件属性stat结构体

     

    (2)文件类型:Linux中的7种文件和宏

    文件类型

    备注

    ①普通文件(regular file)

    S_ISREG()

    如:touch filename

    ②目录文件(directory file)

    S_ISDIR()

    如:mkdir directoryname

    ③块特殊文件(block special file)

    S_ISBLK()

    如:ls –l /dev/sr0 (光驱)

    ④字符特殊文件(character special file)

    S_ISCHR()

    如:ls -l /dev/event2 (键盘)

    ⑤FIFO(named piped)

    S_ISFIFO()

    如:mkfifo filename.pipe

    ⑥套接字(socket)

    S_ISSOCK()

    如:ls -l /dev/log

    ⑦符号链接(symbolic link)

    S_ISLNK()

    如:ln -s srcfile filename.lnk

    (3)stat、fstatt lstat函数

    头文件

    #include<sys/types.h>  //位于/usr/include目录下

    #include<sys/stat.h>   //文件状态信息,如大小,创建时间,UID等。

    函数

    int stat(const char* pathname, struct stat buf);

    int fstat(int fd, struct stat* buf);

    int lstat(const char* pathname, struct stat* buf);

    返回值

    若成功则为0,若出错则为-1

    功能

    返回一个与pathname或fd指定的文件属性信息,存储在结构体buf中

    参数

    (1)pathname:文件路径名

    (2)buf:struct stat结构体

    备注

    (1)lstat函数类似于stat,但是当命名的文件是一个符号连接时,lstat返回该符号连接的有关信息而不是由该符号连接引用的文件的信息

    【编程实验】判断文件类型

    //file_type.c

    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(int argc, char* argv[])
    {
        if(argc < 2){
            fprintf(stderr, "usage: %s files
    ", argv[0]);
            exit(1);
        }
    
        struct stat buff;
        int i = 0;
        for(i=1; i<argc; i++){
            memset(&buff, 0, sizeof(buff));
            if(lstat(argv[i], &buff) < 0){ //使用lstat查看文件属性
                perror("lstat error");
                continue;
            }
    
            printf("%-20s", argv[i]); //左对齐输出文件名
    
            //判断文件类型
            if(S_ISREG(buff.st_mode))
            {
                printf("normal file");
            }else if (S_ISDIR(buff.st_mode)){
                printf("directory");
            }else if (S_ISBLK(buff.st_mode)){
                printf("block device");
            }else if (S_ISCHR(buff.st_mode)){
                printf("character device");
            }else if (S_ISSOCK(buff.st_mode)){
                printf("sock device");
            }else if (S_ISFIFO(buff.st_mode)){
                printf("name piped");
            }else if (S_ISLNK(buff.st_mode)){
                printf("link file");
            }else{
                printf("unknow type");
            }
    
            printf("
    ");
        }
    
        return 0;
    }
  • 相关阅读:
    SpringMVC 通过post接收form参数或者json参数
    Web验证码图片的生成-基于Java的实现
    springmvc防止表单重复提交demo
    MyBatis多表映射demo
    mybatis配置ehcache缓存
    Oracle数据库Where条件执行顺序
    省选模拟10
    省选模拟8
    省选模拟9
    省选模拟7
  • 原文地址:https://www.cnblogs.com/5iedu/p/6349277.html
Copyright © 2020-2023  润新知