Linux 目录操作详解
Linux目录操作详解
本文将介绍常用的Linux目录操作函数,包括获取当前工作目录、切换工作目录、创建和删除目录等操作。
1. 获取当前工作目录
Linux提供了两个常用函数来获取当前工作目录。
1.1 getcwd()
该函数用于获取当前进程的工作目录,并将路径存储在用户提供的缓冲区中。
函数原型:
char *getcwd(char *buf, size_t size);
buf
:存储当前工作目录路径的缓冲区。size
:缓冲区的大小。
如果成功,返回当前工作目录的路径;如果失败,返回NULL
,并设置errno。
1.2 get_current_dir_name()
这是一个较为简化的函数,不需要传入缓冲区,它会动态分配内存来存储当前目录的路径。
函数原型:
char *get_current_dir_name(void);
调用此函数后,返回的字符串指向当前工作目录的路径,使用完后需要调用free()
来释放内存。
2. 切换工作目录
切换工作目录的操作在文件操作中经常会用到。Linux提供了一个函数chdir()
来实现该操作。
2.1 chdir()
该函数用于改变当前进程的工作目录。
函数原型:
int chdir(const char *path);
path
:目标目录的路径。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会被设置为具体的错误码(如目录不存在或权限不足)。
3. 创建和删除目录
3.1 mkdir()
用于创建一个新目录。需要提供目录名和访问权限。
函数原型:
int mkdir(const char *pathname, mode_t mode);
pathname
:新目录的路径。mode
:目录权限,通常使用如0755
来设定权限。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会设置相应的错误。
3.2 rmdir()
用于删除一个空目录。删除时,目录必须为空。
函数原型:
int rmdir(const char *path);
path
:需要删除的目录路径。
返回值:
- 成功:返回0。
- 失败:返回-1,
errno
会设置具体的错误原因(如目录非空)。
4. 获取目录中的文件列表
获取目录中的文件列表通常需要遍历目录。Linux提供了一些API来帮助我们打开、读取和关闭目录。
4.1 opendir() 打开目录
函数原型:
DIR *opendir(const char *pathname);
pathname
:需要打开的目录路径。
返回值:
- 成功:返回
DIR*
,即目录流。 - 失败:返回
NULL
,errno
设置为错误码。
4.2 readdir() 读取目录内容
函数原型:
struct dirent *readdir(DIR *dirp);
dirp
:通过opendir()
获得的目录流。
返回值:
- 成功:返回指向
dirent
结构体的指针,其中包含了当前目录项的信息。 - 失败:返回
NULL
。
4.3 closedir() 关闭目录
函数原型:
int closedir(DIR *dirp);
dirp
:需要关闭的目录流。
返回值:
- 成功:返回0。
- 失败:返回-1。
5. dirent 结构体
在通过readdir()
函数获取目录项时,返回的是一个dirent
结构体,该结构体定义了目录项的相关信息。
结构体定义:
struct dirent {
long d_ino; // inode编号
off_t d_off; // 偏移量
unsigned short d_reclen; // 目录项长度
unsigned char d_type; // 文件类型
char d_name[NAME_MAX+1]; // 文件名
};
d_name
:存储目录项的文件名,最大长度为255字符。d_type
:文件类型,可能的值包括普通文件(DT_REG
)、目录(DT_DIR
)、符号链接(DT_LNK
)等。
6. 示例代码
(1) 获取当前工作目录
以下示例展示了如何使用getcwd()
和get_current_dir_name()
获取当前工作目录:
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
int main() {
// 使用getcwd()获取当前工作目录
char path1[256];
if (getcwd(path1, sizeof(path1)) != NULL) {
cout << "Current working directory (getcwd): " << path1 << endl;
} else {
perror("getcwd failed");
}
// 使用get_current_dir_name()获取当前工作目录
char *path2 = get_current_dir_name();
if (path2 != NULL) {
cout << "Current working directory (get_current_dir_name): " << path2 << endl;
free(path2); // 注意释放内存
} else {
perror("get_current_dir_name failed");
}
return 0;
}
(2)切换工作目录
示例展示了如何使用chdir()
函数来切换工作目录:
#include <iostream>
#include <unistd.h>
#include <stdlib.h>
using namespace std;
int main() {
// 获取当前工作目录
char currentDir[256];
if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
cout << "Current working directory: " << currentDir << endl;
} else {
perror("getcwd failed");
return 1;
}
// 切换到新的目录
if (chdir("/home") == 0) {
cout << "Changed working directory to /home" << endl;
} else {
perror("chdir failed");
return 1;
}
// 获取切换后的工作目录
if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
cout << "New working directory: " << currentDir << endl;
} else {
perror("getcwd failed");
}
return 0;
}
(3)创建和删除目录
以下示例展示了如何使用mkdir()
创建目录和rmdir()
删除空目录:
#include <iostream>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
using namespace std;
int main() {
const char *dirName = "testDir";
// 创建目录
if (mkdir(dirName, 0755) == 0) {
cout << "Directory " << dirName << " created successfully." << endl;
} else {
perror("mkdir failed");
return 1;
}
// 删除目录
if (rmdir(dirName) == 0) {
cout << "Directory " << dirName << " deleted successfully." << endl;
} else {
perror("rmdir failed");
return 1;
}
return 0;
}
(4)遍历目录中的文件
以下示例展示了如何使用opendir()
, readdir()
, 和 closedir()
来遍历目录中的文件:
#include <iostream>
#include <dirent.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
using namespace std;
int main() {
const char *dirName = "/home";
// 打开目录
DIR *dir = opendir(dirName);
if (dir == NULL) {
perror("opendir failed");
return 1;
}
struct dirent *entry;
// 遍历目录中的文件
cout << "Files in directory " << dirName << ":" << endl;
while ((entry = readdir(dir)) != NULL) {
cout << "File: " << entry->d_name << endl;
}
// 关闭目录
closedir(dir);
return 0;
}
(5)结合所有操作的示例
以下是一个较为完整的示例,结合了获取当前目录、切换目录、创建目录和遍历目录等操作:
#include <iostream>
#include <unistd.h>
#include <dirent.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <stdlib.h>
using namespace std;
int main() {
char currentDir[256];
// 获取当前工作目录
if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
cout << "Current working directory: " << currentDir << endl;
} else {
perror("getcwd failed");
return 1;
}
// 创建目录
const char *dirName = "exampleDir";
if (mkdir(dirName, 0755) == 0) {
cout << "Directory " << dirName << " created successfully." << endl;
} else {
perror("mkdir failed");
return 1;
}
// 切换到新创建的目录
if (chdir(dirName) == 0) {
cout << "Changed to directory " << dirName << endl;
} else {
perror("chdir failed");
return 1;
}
// 获取切换后的工作目录
if (getcwd(currentDir, sizeof(currentDir)) != NULL) {
cout << "New working directory: " << currentDir << endl;
} else {
perror("getcwd failed");
}
// 列出当前目录中的文件
DIR *dir = opendir(".");
if (dir == NULL) {
perror("opendir failed");
return 1;
}
struct dirent *entry;
cout << "Files in the current directory:" << endl;
while ((entry = readdir(dir)) != NULL) {
cout << "File: " << entry->d_name << endl;
}
// 关闭目录
closedir(dir);
// 删除目录
if (rmdir(dirName) == 0) {
cout << "Directory " << dirName << " deleted successfully." << endl;
} else {
perror("rmdir failed");
return 1;
}
return 0;
}
原文地址:https://blog.csdn.net/qq_45797625/article/details/145292729
免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!