😁博客主页😁:🚀https://blog.csdn.net/wkd_007🚀
🤑博客内容🤑:🍭嵌入式开发、Linux、C语言、C++、数据结构、音视频🍭
🤣本文内容🤣:🍭介绍 🍭
😎金句分享😎:🍭你不能选择最好的,但最好的会来选择你——泰戈尔🍭
本文未经允许,不得转发!!!
本文介绍Linux下目录相关的一些函数,mkdir、rmdir、getcwd、opendir、readdir、closedir。
- mkdir:创建一个新的空目录
- rmdir:删除一个空目录
- getcwd:获取当前目录
- opendir:打开一个目录
- readdir:读取一个目录
- closedir:关闭一个目录
这节介绍创建、删除一个空目录。
函数原型:
#include <sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
mkdir 函数创建一个新的空目录。其中,.
和..
目录项是自动创建的。所指定的文件访问权限mode
由进程的文件模式创建屏蔽字修改。
函数原型:
#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,在学习这几个函数前,先看看两个结构体DIR
、struct dirent
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);
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.函数原型:
#include <dirent.h>
DIR *opendir(const char *name);
DIR *fdopendir(int fd); // glibc 2.4 版本之后有效
成功返回一个指向目录流的指针。失败返回NULL,并设置errno。
opendir
函数打开与目录名对应的目录流,并返回指向该目录流的指针。流位于目录中的第一个条目处。
fdopendir
函数类似于opendir
,但返回由打开文件描述符fd引用的目录的目录流。成功调用fdopendir
后,fd由实现内部使用,否则应用程序不应使用。
函数原型:
#include <dirent.h>
struct dirent *readdir(DIR *dirp);
readdir
函数返回一个指向目录结构的指针,该结构表示目录流中由dirp
指向的下一个目录条目。它在到达目录流的末尾或发生错误时返回NULL
。
函数原型:
#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 函数函数原型:
#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中指定的目录。
fchdir
与chdir
相同;唯一的区别是该目录是作为打开的文件描述符提供的。
看例子:
#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。
如果文章有帮助的话,点赞👍、收藏?,支持一波,谢谢 😁😁😁