一、文件流和字符描述的转换
1.1、fileno
要求的是内存大小一致
fileno FILE* fp -> int fd fgets(,); int fileno(FILE *stream);
功能: 获得一个文件流指针中的文件描述符
参数: stream:文件流指针
返回值: 成功返回文件描述符 失败返回-1
如果没有特殊要求的,关闭封装度高的函数。
1.2.fdopen
int fd -> FILE *fp FILE *fdopen(int fd, const char *mode);
功能: 这是一个函数,不是强制类型转换 将文件描述符转化为文件流指针
参数: fd:已经打开的文件描述符 mode: "r" "r+" "w" "w+" "a" "a+"
返回值: 成功返回文件流指针 失败返回NULL
二、目录相关操作
2.1 操作流程
- 打开目标目录
- 读取目录
- 关闭目录
目录 当文件看,只不过操作函数和操作文件函数不一样。
2.2 opendir 打开目录
DIR *opendir(const char *name);
功能: 打开一个目录获得一个目录流指针
参数: name:目录名
返回值: 成功返回目录流指针 失败返回NULL
* dir 是通过opendir 获取的,他代表的是整个目录 ;在系统里面叫目录入口,也叫做目录流指针
2.3.readdir 读目录
readdir struct dirent *readdir(DIR *dirp)
功能: 从目录流中读取文件信息并将保存信息的结构体 地址返回
参数: dirp:目录流指针
返回值: 包含文件信息的结构体 出错或者读到目录流末尾返回NULL
-
* info 代表目录的一项,目录里面有很多,要想拿多个,多次调用即可
-
想把文件都读出来,那么我们直接循环读出来,因为我们也不知道他有多少个
-
我们只需要关注文件名和类型
-
判断type 类型和这个宏相不相等,这个宏代表的是文件的类型,宏在里面用的其实是数字保存
-
DT_BLK This is a block device.
-
DT_CHR This is a character device.
-
DT_DIR This is a directory.
-
DT_FIFO This is a named pipe (FIFO).
-
DT_LNK This is a symbolic link.
-
DT_REG This is a regular file.
-
DT_SOCK This is a UNIX domain socket.
-
DT_UNKNOWN The file type could not be deter‐mined.
2.4 closedir关闭目录
int closedir(DIR *dirp);
功能:关闭之前已经打开的目录流对象
参数:opendir的返回结果中目录流对象
返回值:成功 0 失败 -1;、
对目录读进行操作的代码示例
#include<stdio.h>
#include <sys/types.h>
#include <dirent.h>
int main(int agrc,char *argv[])
{
DIR* dir = opendir("./");
if(NULL == dir)
{
printf("opendir error");
return 1;
}
while(1)
{
struct dirent * info = readdir(dir);
if(NULL == info)
{
break;
}
switch(info->d_type)
{
case DT_DIR:
printf("目录 ");
break;
case DT_BLK:
printf("块设备 ");
break;
case DT_CHR:
printf("字符设备 ");
break;
case DT_REG:
printf("普通文件 ");
break;
default:
printf("其他 ");
break;
}
printf("%s\n",info->d_name);
}
closedir(dir);
2.5.getcwd
getcwd等价于命令pwd char *getcwd(char *buf, size_t size)
buf 接收当前的
屁股后面会放\0
路径,创建一个buf 功能: 获得当前的工作路径
参数: buf:保存工作路径空间的首地址 size:保存路径空间的长度(buf 的最大长度)
返回值: 成功返回包含路径空间的字符串首地址 失败返回NULL
2.6.mkdir
int a =200; int mkdir(const char *pathname, mode_t mode);//777 666 --x--x--x (mode 给权限) 功能: 创建一个目录 666-权限给的是775,默认是775,但由于umask的值,和目录和文件的权限与其有关,将这个数减掉。
对于目录来说 x 是cd 看起能不能切换进去。
目录名不能重名,文件也不能重名,区分大小写
参数: pathname:路径 mode: mode & ~umask 0002
写好之后进去会自动做该操作
返回值: 成功返回0 失败返回-1
2.7.rmdir
rm -fr rmdir int rmdir(const char *pathname);
功能: 删除一个空目录文件
前提是空目录,./ ../ 这是一个空目录,我们认为其是空目录
参数: pathname:目录文件的名字 返回值: 成功返回0 失败返回-1
2.8 stat
1.stat 获取文件的详细属性 ()
int stat(const char *path, struct stat *buf);
INODE (文件在硬盘上的编号,也就是位置)
文件名和内容分开放;软连接删掉没有影响,但是硬链接删除之后,软连接就无法正常使用
st 结构体变量不需要我们填写,由函数进行填写
重点
ino_t
mode_t 文件的类型以及权限(类似777)
注意在代码书写的过程中,换行的时候将优先级的放在第二行前
gid_t 组号
st_size 字节数
时间在系统中记得是从1970年1月1号之后到现在的总秒数,一秒一记
mode 模式无法直接出来,需要调用inode,调用宏文件进行判断。宏判断特定7位上是不是1
判断权限 进行位运算,在其mode 里面由=有32位,低9位就是 实际上的权限位置,我们进行系统里面的宏运算,进行位运算,来判断其权限
功能: 获得文件的属性
参数: pzath: 文件的路径
buf: 属性存放空间的首地址
返回值: 成功返回0 失败返回-1