Linux目录操作详解
- 1. 获取当前工作目录
- 1.1 getcwd()
- 1.2 get_current_dir_name()
- 2. 切换工作目录
- 2.1 chdir()
- 3. 创建和删除目录
- 3.1 mkdir()
- 3.2 rmdir()
- 4. 获取目录中的文件列表
- 4.1 opendir() 打开目录
- 4.2 readdir() 读取目录内容
- 4.3 closedir() 关闭目录
- 5. dirent 结构体
- 6. 示例代码
- (1) 获取当前工作目录
- (2)切换工作目录
- (3)创建和删除目录
- (4)遍历目录中的文件
- (5)结合所有操作的示例
本文将介绍常用的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;
}