IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取

这篇具有很好参考价值的文章主要介绍了IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

      一、文件IO

1、文件io通过系统调用来操作文件

系统调用:系统提供给用户的一组API(接口函数)

        open/read/write/close/lseek...

用户空间进程访问内核的接口

把用户从底层的硬件编程中解放出来

极大的提高了系统的安全性

使用户程序具有可移植性(同一系统下)

是操作系统的一部分

文件io没有缓存区概念

文件io操作文件的方式:通过文件描述符

shell默认打开了三个文件:

标准输入  标准输出 标准错误

stdin stdout  stderr                  用流来表示

      0         1       2                   用文件描述符表示

2、文件IO相关函数

       1、open函数

       功能:

              打开一个文件

       头文件

          #include <sys/types.h>

       #include <sys/stat.h>

       #include <fcntl.h>

       函数原型

              int open(const char *pathname, int flags);

        int open(const char *pathname, int flags, mode_t mode);

       参数

        pathname:文件的路径

              flags:文件打开的方式

                     O_RDONLY:只读

                     O_WRONLY:只写

                     O_RDWR:可读可写

                     这三个宏互斥(三选一)

                     O_CREAT:如果文件不存在,则创建文件,此时用到open函数的第二种形式。

                     O_TRUNC:如果文件存在则清空文件的内容。

                     O_APPEND:以追加的方式打开文件。

                     IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

       mode:文件的权限,八进制(0777)

IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

       返回值

              成功返回一个新的文件描述符,失败返回(-1)并设置错误号。

       2、close函数

       作用:

              关闭文件

       头文件

          #include <unistd.h>

       函数原型

              int close(int fd);

       参数

        想要关闭的文件描述符

       返回值

              成功返回0,失败返回(-1)并设置错误号。

       3、read/write

        1、read

              作用:

                     向文件读取内容

           头文件:

            #include <unistd.h>

              函数原型

                ssize_t read(int fd, void *buf, size_t count);

              参数

                     fd:想要操作的文件描述符

                     buf:读取到的内容放到哪个地址

                     count:读取到的文件中的字符数量

              返回值:

              成功返回已经读取到的字节数,失败返回-1并设置错误号,读取到文件末尾返回0。

        2、write

              作用:

                     向文件写入内容

           头文件:

            #include <unistd.h>

              函数原型

                ssize_t write(int fd, void *buf, size_t count);

              参数

                     fd:想要写入的文件描述符

                     buf:需要写入文件的内容

                     count:写入文件中字符数量

              返回值:

                     成功返回已经写入的字节数,失败返回-1并设置错误号。

       4、lseek

              作用:

                     偏移文件内的书签

           头文件:

            #include <sys/types.h>

              函数原型

                off_t lseek(int fd, off_t offset, int whence);

              参数

                     fd:想要写入的文件描述符

                     offset:偏移量,正数表示后偏移,负数前偏移,0不偏移

                     whence:书签偏移的起始位置

                                   SEEK_SET:文件头

                                   SEEK_CUR:当前位置

                                   SEEK_END:文件末尾

              返回值:

                     成功返回当前偏移到的位置,失败返回-1并设置错误号。

      二、文件和目录

1、stat

       #include <sys/types.h>

       #include <sys/stat.h>

       #include <unistd.h>

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

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

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

stat,lstat通过传入的pathname获取文件属性

fstat通过用open打开的文件的文件描述符获取文件属性

stat在操作软链接文件时会获取源文件的相关属性

lstat在操作软链接文件时会获取链接文件的相关属性

成功返回0,失败返回-1,并设置错误号

相关结构体

struct stat {

               dev_t     st_dev;         /* ID of device containing file */

               ino_t     st_ino;         /* Inode number */

               mode_t    st_mode;        /* File type and mode */

               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 ID (if special file) */

               off_t     st_size;        /* Total size, in bytes */

               blksize_t st_blksize;     /* Block size for filesystem I/O */

               blkcnt_t  st_blocks;      /* Number of 512B blocks allocated */

                                   /* Since Linux 2.6, the kernel supports nanosecond

                  precision for the following timestamp fields.

                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;  /* Time of last access */

               struct timespec st_mtim;  /* Time of last modification */

               struct timespec st_ctim;  /* Time of last status change */

           #define st_atime st_atim.tv_sec      /* Backward compatibility */

           #define st_mtime st_mtim.tv_sec

           #define st_ctime st_ctim.tv_sec

           };

1、文件类型(可以用以下的宏确定文件类型,这些宏的参数都是struct stat结构中的ts_mode成员)

S_ISREG(m)  is it a regular file?

S_ISDIR(m)  directory?

S_ISCHR(m)  character device?

S_ISBLK(m)  block device?

S_ISFIFO(m) FIFO (named pipe)?

S_ISLNK(m)  symbolic link? (Not in POSIX.1-1996.)

S_ISSOCK(m) socket? (Not in POSIX.1-1996.)

2、文件权限

       存放在st_mode低9位,从高位到低位分别表示用户权限、同组用户权限、其它用户权限,该位为1表示有权限,0表示没有权限

3、链接数

直接通过st_nlink得到

4、文件所有者

getpwuid函数相关操作得到

5、文件所属组

getgrgid函数相关操作得到

6、文件字节大小

直接通过st_size得到

7、文件更新时间

ctime(&st_ctime)得到文件的更新时间

#include <stdio.h>
#include <sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<string.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
int main(int argc, char *argv[])
{
   if(2!=argc)
    {
        printf("error\n");
    }
    struct stat st;
    lstat(argv[1],&st);
    if(S_ISREG(st.st_mode))
        printf("-");
    else if (S_ISDIR(st.st_mode))
        printf("d");
    else if(S_ISLNK(st.st_mode))
        printf("l");
    int i=8;
    for ( ; i >= 0; i-=3)
    {
        if(st.st_mode&1<<i!=0)
           printf("r");
        else
            printf("-");

        if(st.st_mode&1<<(i-1)!=0)
            printf("w");
        else
            printf("-");
        if(st.st_mode&1<<(i-2)!=0)
            printf("x");
        else
            printf("-");

    }
//用户名
    struct passwd *pw=getpwuid(st.st_uid);
//链接数    
printf(" %ld",st.st_nlink);
    printf(" %s ",pw->pw_name);
struct group *gr =getgrgid(st.st_gid);
//用户组名    
printf( "%s",gr->gr_name);
//长度    
printf(" %ld",st.st_size);
    char arr[100]={0};
//获取时间
    strcpy(arr,ctime(&st.st_mtime));
    if(arr[strlen(arr)-1]=='\n')
        arr[strlen(arr)-1]='\0';
    printf(" %s ",arr);
    puts("");
    return 0;

}

2、目录文件函数

    1opendir

       作用:

           打开一个目录文件

       头文件

           #include<sys/types.h>

           #include<dirent.h>

       函数原型:

           DIR *opendir(const char *name)

       参数:

           name:目录文件

       返回值:

           成功返回目录流指针,失败返回 NULL并设置错误号。

IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

    2、readdir

    作用:

       读取目录当中一个文件的属性

    头文件:

       dirent.h

    函数文件

       struct dirent *readdir(DIR * dirp);

    参数:

       dirp:想要操作的目录流指针

    返回值:

       成功返回读取到的文件的相关信息的地址,被保存在一个struct dirent结构体中,失败或者读完了所有文件的返回NULL

相关结构体:

struct dirent {

               ino_t          d_ino;       /* Inode number */

               off_t          d_off;       /* Not an offset; see below */

               unsigned short d_reclen;    /* Length of this record */

               unsigned char  d_type;      /* Type of file; not supported

                                              by all filesystem types */

               char           d_name[256]; /* Null-terminated filename */

           };

       3、closedir

       作用:

              关闭目录流指针

       头文件:

              #include <sys/types.h>

                  #include <dirent.h>

       函数原型:

              int closedir(DIR *dirp);

       参数:

              dirp:目录流指针

       返回值:

       成功返回0,失败返回-1并设置错误号

IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO

IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取,算法,linux,文件IO文章来源地址https://www.toymoban.com/news/detail-671196.html

到了这里,关于IO线程,文件IO(open),文件(stat)与目录(opendir)属性的读取的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mv: 无法获取“/opt/module/hadoop/logs/hadoop-atguigu-nodemanager-hadoop102.out.1“ 的文件状态(stat): 没有那个文件或目录

    最近在回顾之前做过的离线数仓项目,在启动hadoop时出现了如下错误: 经过一些资料搜集发现问题的根本原因在于/opt/module/hadoop/etc/hadoop/目录下的workers文件配置出现错误。 文件内容不能够包含localhost 我原本的文件配置如下: 修改后配置如下: 我们简单解释一下workers文件的

    2024年02月05日
    浏览(41)
  • 文件IO,目录IO的学习

    用法:#include“head.h”    -     在当前目录下寻找头文件 主函数的传参中,argc是传参的个数  ,const char *argv[]是一个指针数组,存放的指针类型数据 argv【n】,n=1/2/3 分别代表三个指针参数 标准示例:     off_t lseek(int fd, off_t offset, int whence);        功能:            

    2024年02月20日
    浏览(24)
  • 目录打开显示提示文件或目录损坏且无法读取、文件或目录损坏且无法读取的破解之道

        咱们在平日工作时,通常都会将资料放进不同的目录中,方便咱们找到,随着时间的推移就会产生有越来越多目录。最近有位用户了这样一个问题,就是目录无论怎么都无法打开,这样就无法浏览、使用里面的资料了,影响到了咱们的正常使用,那目录文件或目录损坏且

    2024年02月02日
    浏览(78)
  • Open3D读取文件

    Open3D可以读取点云文件,三角网格文件,也可以读取图片。具体方法如下: 一、点云文件操作         Open3D支持的文件格式有xyz,xyzn,xyzrgb,pts,ply,pcd等文件。读取的方式也非常简单。data = o3d.io.read_point_cloud(\\\"文件名“) 1、读写文件         函数原型如下:    

    2024年02月08日
    浏览(39)
  • IO流读取上传文件的内容

     

    2024年01月21日
    浏览(50)
  • 【文件IO】Linux 文件操作(一) —— 遍历指定目录下的所有文件

    目录 一、访问目录相关函数 1、打开/访问目录 (opendir / fdopendir) 2、读取目录内容 (readdir) 3、关闭目录 (closedir) 二、遍历指定目录下的所有文件 opendir / fdopendir 函数的作用是访问指定路径的目录,函数声明如下: (1) opendir opendir 函数是通过用户提供的目录路径来访问目录, 参

    2024年02月04日
    浏览(45)
  • 【Linux操作系统】Linux系统编程实现递归遍历目录,详细讲解opendir、readdir、closedir、snprintf、strcmp等函数的使用

    在Linux系统编程中,经常需要对目录进行遍历操作,以获取目录中的所有文件和子目录。递归遍历目录是一种常见的方法,可以通过使用C语言来实现。本篇博客将详细介绍如何使用C语言实现递归遍历目录的过程,并提供相应的代码示例,同时解释相关函数的使用。 1.1.1 函数

    2024年02月12日
    浏览(30)
  • 【JavaEE】文件操作和IO-目录扫描全文检索小程序

    不知道说啥了,看看吧 在之前的学习中,基本上都是围绕内存展开的~ MySQL 主要是操作硬盘的 文件IO也是是操作硬盘的~ IO : i nput o utput 创造文件,删除文件,重命名文件,创建目录······ 一些操作没有权限也做不了~ 1.1 路径 就是我们的文件系统上的一个文件/ 目录 的具

    2024年02月09日
    浏览(30)
  • JavaEE & 文件操作和IO & 目录扫描全文检索小程序

    不知道说啥了,看看吧 在之前的学习中,基本上都是围绕内存展开的~ MySQL 主要是操作硬盘的 文件IO也是是操作硬盘的~ IO : i nput o utput 创造文件,删除文件,重命名文件,创建目录······ 一些操作没有权限也做不了~ 1.1 路径 就是我们的文件系统上的一个文件/ 目录 的具

    2023年04月09日
    浏览(27)
  • 051-WEB攻防-前后台功能点&文件下载&文件读取&文件删除&目录遍历&目录穿越

    1、文件安全-前后台功能点-下载读取删除 2、目录安全-前后台功能点-目录遍历目录穿越 演示案例: ➢文件安全-下载删除-案例黑白盒 ➢目录安全-遍历穿越-案例黑白盒 1、下载=读取(获取源码) 文件下载 利用:下载敏感文件(数据库配置,中间件配置,系统密匙等文件信息

    2024年03月10日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包