Linux文件IO-目录操作及文件属性

目录操作及文件属性

在linux下,目录也可以被open打开,得到一个文件描述符,但是不能用read去读一个目录

目录和普通文件的区别
在linux下面任何文件都有一个inode
普通文件的内容 —》 ”文件里面的内容“

目录的内容:
目录下面可以有文件,也可以有目录
目录下面内容其实就是一个”目录项数组“
在创建一个目录的时候,系统会为它创建一个”目录项数组“
往这个目录下面添加文件或者目录的时候,就会增加一个目录项在这个数组中

目录操作

打开一个目录

功能:打开一个目录
头文件:
#include <sys/types.h>
#include <dirent.h>
函数原型:
       DIR *opendir(const char *name);
       	参数:
       		@name : 指定要打开的文件名 建议带路径
       	返回值:
       		DIR * 结构体指针
       		至于这个结构体指针是什么内容,无需关系的
       			--》 DIR * 表示一个打开目录
       		后续的读和关闭目录的操作都是用DIR *
			成功返回一个已经打的的目录的指针
			失败返回NULL,同时errno被设置

读目录项

功能:读一个目录的目录项数组
头文件:
#include <dirent.h>
函数原型:
       struct dirent *readdir(DIR *dirp);
			参数:
				@:dirp:opendir返回的参数 表示从哪一个目录读
			返回值:
				目录项指针
					每一个目录下面都可能有多个目录项,每一次只能获取一个直到返回NULL为止
			 	成功就返回指向下一个目录项指针,直到读完为止则返回NULL
			 	失败返回NULL	
                
            struct dirent {
    
    
               ino_t          d_ino;       /* I结点的编号 */
               off_t          d_off;       /* 目录项的偏移量 */
               unsigned short d_reclen;    /* 这个结构体的大小*/
               unsigned char  d_type;      /* 该目录项指向文件的类型 */
               char           d_name[256]; /* 该目录项指向文件的文件名(不带路径)*/
           };
           d_ino和 d_name所有linux系统都支持的
           为了让代码具有移植性 一般只用d_ino 和d_name 

关闭目录

#include <sys/types.h>
#include <dirent.h>
int closedir(DIR *dirp);
	关闭一个目录
	成功返回0
	失败返回-1,同时设置errno

获取当面进程的工作路径

功能:查看当前进程的工作路径
头文件:
       #include <unistd.h>
函数原型:
       char *getcwd(char *buf, size_t size);
			参数:
				@buf:缓存区,用于保存获取到的工作目录的绝对路径
				@size:缓存区的大小
			返回值:
				成功返回或取到的当前路径,与buf的内容是一样的
				失败返回NULL 同时设置errno

创建目录

 #include <sys/stat.h>
       #include <sys/types.h>
    
       int mkdir(const char *pathname, mode_t mode);
       			参数:
       				@ pathname:待创建目录的名字 建议加上路径
       				@ mode  : 权限 一般用八进制
       			返回值:
       				成功返回0,失败返回-1,同时设置errno

移除一个空目录

#include <unistd.h>
       int rmdir(const char *pathname);
			参数:
   				@pathname:要删除的路径名
   			返回值:
   				成功返回0,失败返回-1,同时设置errno

切换目录

#include <unistd.h>
 int chdir(const char *path);
       	参数:
        	@path 需要切换的目录
        返回值:
   				成功返回0,失败返回-1,同时设置errno

文件属性

#include <sys/types.h>
 #include <sys/stat.h>
 #include <unistd.h>
		功能:获取pathname指定的文件属性,保存到statbuf指向的空间 ,该空间由用户自己定义
       int stat(const char *pathname, struct stat *statbuf);

		struct stat {
    
    
               dev_t     st_dev;         /* 该文件的设备ID */
               ino_t     st_ino;         /* I结点的编号 */
               mode_t    st_mode;        /* 文件的类型与权限 */
                     
                  if(st_mode & S_IFMT == S_IFDIR)
                  {
    
    
                  		这个文件是个 directory
                  }
                             
                   S_IFSOCK      socket
                   S_IFLNK       symbolic link
                   S_IFREG       regular file
                   S_IFBLK       block device
                   S_IFDIR       directory
                   S_IFCHR       character device
                   S_IFIFO       FIFO
  				
               nlink_t   st_nlink;       /*硬链接的数目*/
               uid_t     st_uid;         /* 用户ID */
               gid_t     st_gid;         /* 组ID */
               dev_t     st_rdev;        /* 设备ID */
               off_t     st_size;        /* 文件的大小 */
               blksize_t st_blksize;     /* 文件系统的块大小 */
               blkcnt_t  st_blocks;      /*这个文件占了多少块(512字节为1块) */ 
               struct timespec st_atim;  /* 最后访问文件内容的时间 */
               struct timespec st_mtim;  /*最后修改文件内容的时间 */
               struct timespec st_ctim;  /* 最后修改文件属性的时间 */
           };

猜你喜欢

转载自blog.csdn.net/weixin_46836491/article/details/126332288