【Linux C | 文件操作】目录相关操作 | mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir

发布时间:2024年01月19日

😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭

本文未经允许,不得转发!!!


在这里插入图片描述

🎄一、概述

本文介绍Linux下目录相关的一些函数,mkdir、rmdir、getcwd、opendir、readdir、closedir。

  • mkdir:创建一个新的空目录
  • rmdir:删除一个空目录
  • getcwd:获取当前目录
  • opendir:打开一个目录
  • readdir:读取一个目录
  • closedir:关闭一个目录

在这里插入图片描述

🎄二、mkdir、rmdir 函数

这节介绍创建、删除一个空目录。

?2.1 mkdir 函数

函数原型:

#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);

mkdir 函数创建一个新的空目录。其中,...目录项是自动创建的。所指定的文件访问权限mode由进程的文件模式创建屏蔽字修改。

?2.2 rmdir 函数

函数原型:

#include <unistd.h>
int rmdir(const char *pathname);

rmdir 函数可以删除-一个空目录。空目录是只包含...这两项的目录。

看例子:

#include <stdio.h>
#include <sys/stat.h>
#include <unistd.h>

int main()
{
	int ret = mkdir("./test_mkdir", 0664);
	if(ret == -1)
	{
		perror("mkdir");
		//return -1;
	}
	
	ret = rmdir("./test_mkdir");
	if(ret == -1)
	{
		perror("rmdir");
		return -1;
	}
	return 0;
}

注意:mkdir、rmdir这两个函数的功能比较局限,可以使用system直接调用mkdir、rmdir两个shell命令使用创建目录和删除目录。

在这里插入图片描述

🎄三、读取目录

读取目录的话,需要三个函数,opendir、readdir、closedir,在学习这几个函数前,先看看两个结构体DIRstruct dirent

?3.1 DIR 结构体

DIR 结构体是描述目录流的,一般由opendir打开一个目录返回。它在<dirent.h>头文件中被声明为一个不透明的数据类型。不透明是指在Linux应用层该结构体成员是不可见的,也就是说,Linux应用层不会使用到DIR结构体的成员。

struct __dirstream
{
	void *__fd; /* `struct hurd_fd' pointer for descriptor.   */
	char *__data; /* Directory block.   */
	int __entry_data; /* Entry number `__data' corresponds to.   */
	char *__ptr; /* Current pointer into the block.   */
	int __entry_ptr; /* Entry number `__ptr' corresponds to.   */
	size_t __allocation; /* Space allocated for the block.   */
	size_t __size; /* Total valid data in the block.   */
	__libc_lock_define (, __lock) /* Mutex lock for this structure.   */
};
typedef struct __dirstream DIR;

一般情况下,由opendir函数获取DIR*指针,由下面这些函数使用DIR*指针

#include <dirent.h>
struct dirent *readdir(DIR *dp);
void rewinddir(DIR *dp);
int closedir(DIR *dp);
long telldir(DIR *dp);
void seekdir(DIR *dp,long loc);

?3.2 struct dirent 结构体

struct dirent* 结构体是指向目录结构的指针,在使用readdir函数读取目录时会返回,包含了读取到的目录下某个条目的信息。

struct dirent {
    ino_t          d_ino;       /* Inode number 索引节点号*/
    off_t          d_off;       /* Not an offset; see below 在目录文件中的偏移*/
    unsigned short d_reclen;    /* Length of this record 文件名长*/
    unsigned char  d_type;      /* Type of file; not supported
                                   by all filesystem types */
    char           d_name[256]; /* Null-terminated filename */
};

这个结构体常用的成员是d_name(文件名),d_type(文件类型),d_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 determined.

?3.3 opendir 函数

函数原型:

#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd);  // glibc 2.4 版本之后有效
成功返回一个指向目录流的指针。失败返回NULL,并设置errno。

opendir函数打开与目录名对应的目录流,并返回指向该目录流的指针。流位于目录中的第一个条目处。

fdopendir函数类似于opendir,但返回由打开文件描述符fd引用的目录的目录流。成功调用fdopendir后,fd由实现内部使用,否则应用程序不应使用。


?3.4 readdir 函数

函数原型:

#include <dirent.h>
struct dirent *readdir(DIR *dirp);

readdir函数返回一个指向目录结构的指针,该结构表示目录流中由dirp指向的下一个目录条目。它在到达目录流的末尾或发生错误时返回NULL


?3.5 closedir 函数

函数原型:

#include <dirent.h>
int closedir(DIR *dirp);

closedir函数关闭与dirp关联的目录流。成功调用closedir()还会关闭与dirp相关联的底层文件描述符。

此调用之后,目录流描述符dirp不可用。


看例子:

#include <stdio.h>
#include <dirent.h>

int main() {
    DIR *dir;
    struct dirent *dirItem;
    dir = opendir("/tmp");

    if (dir != NULL) {
        while ((dirItem = readdir(dir)) != NULL) {
			switch(dirItem->d_type)
			{
				case DT_DIR:
					printf("%14s","directory: ");
					break;
				case DT_REG:
					printf("%14s","regular file: ");
					break;
				default:
					printf("%14s","unknow file: ");
					break;
					
			}
            printf("%s\n", dirItem->d_name);
        }
        closedir(dir);
    } else {
        perror("Couldn't open directory");
    }
    return 0;
}

在这里插入图片描述

在这里插入图片描述

🎄四、getcwd、chdir 函数

getcwd 函数函数原型:

#include <unistd.h>
char *getcwd(char *buf, size_t size);

getcwd返回调用进程的当前工作目录的绝对路径名,以null结尾的字符串。路径名将作为函数结果并通过参数buf(如果存在)返回。向此函数传递两个参数,一个是缓冲地址buf,另一个是缓冲的长度size(单位:字节)。该缓冲必须有足够的长度以容纳绝对路径名再加上一个null终止字符,否则返回出错。


chdir 函数函数原型:

#include <unistd.h>
int chdir(const char *path);
int fchdir(int fd);

chdir将调用进程的当前工作目录更改为path中指定的目录。
fchdirchdir相同;唯一的区别是该目录是作为打开的文件描述符提供的。


看例子:

#include <stdio.h>
#include <string.h>
#include <unistd.h>

int main() {
    char buf[256] = {0,};
	getcwd(buf,sizeof(buf));
	printf("cwd:[%s]\n",buf);
	
	sprintf(buf,"%s%s",buf,"/test_mkdir");
	printf("buf:[%s]\n",buf);
	chdir(buf);
	
	memset(buf, 0, sizeof(buf));
	getcwd(buf,sizeof(buf));
	printf("cwd:[%s]\n",buf);
    return 0;
}

在这里插入图片描述

🎄五、总结

本文介绍Linux系统编程中,目录相关操作的几个函数:mkdir、rmdir、opendir、readdir、closedir、getcwd、chdir。

在这里插入图片描述
如果文章有帮助的话,点赞👍、收藏?,支持一波,谢谢 😁😁😁

文章来源:https://blog.csdn.net/wkd_007/article/details/135355417
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。