1、stat/lstat 函数:
int stat(const char *path, struct stat *buf);
参数:
path: 文件路径
buf:(传出参数) 存放文件属性。
返回值:
成功: 0
失败: -1 errno
获取文件大小: buf.st_size
获取文件类型: buf.st_mode
获取文件权限: buf.st_mode
符号穿透:stat会。lstat不会。
2、link/unlink:
隐式回收。
3、目录操作函数:
DIR * opendir(char *name);
int closedir(DIR *dp);
struct dirent *readdir(DIR * dp);
struct dirent {
inode
char dname[256];
}
./a.out ls.c /home/itcast/28_Linux ./abc/
/home/itcast/28_Linux/testdir/
4、递归遍历目录:ls-R.c
4.1 整体流程:
(1).判断命令行参数,获取用户要查询的目录名。 int argc, char *argv[1]
argc == 1 --> ./
(2). 判断用户指定的是否是目录。 stat S_ISDIR(); --> 封装函数 isFile() { }
(3). 读目录: read_dir() {
opendir(dir)
while (readdir()){
a).普通文件,直接打印
b).目录:
拼接目录访问绝对路径。sprintf(path, "%s/%s", dir, d_name)
递归调用自己。--> opendir(path) readdir closedir
}
closedir()
}
read_dir() --> isFile() ---> read_dir()
4.2 递归遍历目录代码示例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <dirent.h>
#include <pthread.h>
void isFile(char *name);
// 打开目录读取,处理目录
void read_dir(char *dir, void (*func)(char *))
{
char path[256];
DIR *dp;
struct dirent *sdp;
dp = opendir(dir);
if (dp == NULL) {
perror("opendir error");
return;
}
// 读取目录项
while((sdp = readdir(dp)) != NULL) {
if (strcmp(sdp->d_name, ".") == 0 || strcmp(sdp->d_name, "..") == 0) {
continue;
}
//fprintf();
// 目录项本身不可访问, 拼接. 目录/目录项
sprintf(path, "%s/%s", dir, sdp->d_name);
// 判断文件类型,目录递归进入,文件显示名字/大小
//isFile(path);
(*func)(path);
}
closedir(dp);
return ;
}
void isFile(char *name)
int ret = 0;
struct stat sb;
// 获取文件属性, 判断文件类型
ret = stat(name, &sb);
if (ret == -1) {
perror("stat error");
return ;
}
// 是目录文件
if (S_ISDIR(sb.st_mode)) {
read_dir(name, isFile);
}
// 是普通文件, 显示名字/大小
printf("%10s\t\t%ld\n", name, sb.st_size);
return;
}
int main(int argc, char *argv[])
{
// 判断命令行参数
if (argc == 1) {
isFile(".");
} else {
isFile(argv[1]);
}
return 0;
}
5、dup 和 dup2
int dup(int oldfd); 文件描述符复制。
oldfd: 已有文件描述符
返回:新文件描述符。
int dup2(int oldfd, int newfd); 文件描述符复制。重定向。
6、fcntl 函数实现 dup:
int fcntl(int fd, int cmd, ....)
cmd: F_DUPFD
参3: 被占用的,返回最小可用的。
未被占用的, 返回=该值的文件描述符。