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

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系统编程资料

上一篇:(原创)[C#] DataTable排序扩展方法


下一篇:hive总结