系统编程学习4:文件系统

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:  	被占用的,返回最小可用的。

		未被占用的, 返回=该值的文件描述符。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值