目录操作及文件属性
在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; /* 最后修改文件属性的时间 */
};