ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux系统函数学习_(6)目录操作函数chdir函数与getcwd函数、mkdir函数与rmdir函数、opendir函数、readdir函数及closedir函数

2021-09-03 21:32:21  阅读:149  来源: 互联网

标签:chdir 函数 int mkdir char DT include 目录


linux系统函数学习_(6)目录操作函数chdir函数与getcwd函数、mkdir函数与rmdir函数、opendir函数、readdir函数及closedir函数

chdir()函数

修改当前进程的路径

int chdir(const char *path);

getcwd()函数

获取当前进程工作目录

char *getcwd(char *buf, size_t size);

chdir()函数与getcwd()函数结合在一起使用理解

示例

// chdir_getcwd.c
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <unistd.h>

int main(int argc, char* argv[])
{
    if(argc < 2)
    {
        printf("a.out dir\n");
        exit(1);
    }

    int ret = chdir(argv[1]);
    if(ret == -1)
    {
        perror("chdir");
        exit(1);
    }

    int fd = open("chdir.txt", O_CREAT | O_RDWR, 0777);
    if(fd == -1)
    {
        perror("open");
        exit(1);
    }
    close(fd);

    char buf[128];
    getcwd(buf, sizeof(buf));
    printf("current dir: %s\n", buf);

    return 0;
}

mkdir()函数

创建目录 - -注意:创建的目录需要有执行权限,否则无法进入目录

int mkdir(const char *pathname, mode_t mode);

示例

// mkdir.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>

int main(int argc, char* argv[])
{
    if(argc < 3)
    {
        printf("a.out newDir mode\n");
        exit(1);
    }

    int mode = strtol(argv[2], NULL, 8);
    int ret = mkdir(argv[1], mode);
    if(ret == -1)
    {
        perror("mkdir");
        exit(1);
    }
    return 0;
}

rmdir()函数

删除一个空目录

int rmdir(const char *pathname);

opendir()函数

打开一个目录

DIR *opendir(const char *name);

返回值:DIR结构指针,该结构是一个内部结构,保存所打开的目录信息,作用类似于FILE结构,函数出错返回NULL

readdir()函数

读取目录

struct dirent *readdir(DIR *dirp);

返回一条记录项:

struct dirent
{
	ino_t d_ino; 				  // 此目录进入点的inode
    off_t d_off; 				  // 目录文件开头至此目录进入点的位移
    unsigned short int d_reclen;  // 文件的长度, 不包含NULL字符
    unsigned char d_type;		  // 所指的文件类型 
    char d_name[256]; 			  // 以NULL结尾的文件名
};

d_type: DT_BLK-块设备 DT_CHR-字符设备 DT_DIR-目录 DT_LNK-软连接 DT_FIFO-管道 DT_REG-普通文件 DT_SOCK-套接字 DT_UNKNOWN-未知

closedir()函数

关闭目录

int closedir(DIR *dirp);

示例

// opendir_readdir_closedir.c
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <dirent.h>

int getFileNum(char* root)
{
    // 打开目录
    DIR* dir = opendir(root);
    if(dir == NULL)
    {
        perror("opendir");
        exit(0);
    }

    // 读目录
    int total = 0;
    char path[1024] = {0};
    struct dirent* ptr = NULL;
    while((ptr = readdir(dir)) != NULL)
    {
        // 跳过 . 和 ..
        if(strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
        {
            continue;
        }
        // 判断是不是文件
        if(ptr->d_type == DT_REG)
        {
            total ++;
        }
        // 如果是目录
        if(ptr->d_type == DT_DIR)
        {
            // 递归读目录
            sprintf(path, "%s/%s", root, ptr->d_name);
            total += getFileNum(path);
        }
    }
    closedir(dir);
    return total;
}

int main(int argc, char* argv[])
{
    // 读目录, 统计文件个数
    int total = getFileNum(argv[1]);
    // 打印
    printf("%s has file number: %d\n", argv[1], total);
    return 0;
}

参考

参考黑马程序员linux系统编程资料

标签:chdir,函数,int,mkdir,char,DT,include,目录
来源: https://blog.csdn.net/abc301302/article/details/120089934

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有