一、几个简单的目录操作函数
1)获取当前工作目录
包含头文件:<unistd.h>
char *getcwd(char *buf, size_t size);
char *get_current_dir_name(void);
示例:
#include <iostream>
#include <unistd.h>
using namespace std;
int main()
{
char path1[256]; // linux系统目录的最大长度是255。
getcwd(path1,256);
cout << "path1=" << path1 << endl;
char *path2=get_current_dir_name();
cout << "path2=" << path2 << endl;
free(path2); // 注意释放内存。malloc() new delete
}
2)切换工作目录
包含头文件:<unistd.h>
int chdir(const char *path);
返回值:0-成功;其它-失败(目录不存在或没有权限)。
3)创建目录
包含头文件:<sys/stat.h>
int mkdir(const char *pathname, mode_t mode);
pathname-目录名。
mode-访问权限,如0755,不要省略前置的0。
返回值:0-成功;其它-失败(上级目录不存在或没有权限)。 /tmp/aaa /tmp/aaa/bbb
4)删除目录
包含头文件: <unistd.h>
int rmdir(const char *path);
path-目录名。
返回值:0-成功;其它-失败(目录不存在或没有权限)。
示例代码:
#include <iostream>
#include <unistd.h> // 包含获取和切换目录的函数
#include <sys/stat.h> // 包含创建目录的函数
using namespace std;
int main()
{
char path1[256];
// 获取当前工作目录
if (getcwd(path1, sizeof(path1)) != NULL) {
cout << "当前工作目录是: " << path1 << endl;
} else {
perror("获取当前目录失败");
}
// 切换工作目录到 /tmp
if (chdir("/tmp") == 0) {
cout << "成功切换到目录 /tmp" << endl;
} else {
perror("切换目录失败");
}
// 创建新目录
const char* new_dir = "/tmp/test_directory";
if (mkdir(new_dir, 0755) == 0) {
cout << "目录创建成功: " << new_dir << endl;
} else {
perror("创建目录失败");
}
// 删除目录
if (rmdir(new_dir) == 0) {
cout << "目录删除成功: " << new_dir << endl;
} else {
perror("删除目录失败");
}
return 0;
}
在这段代码中:
- 使用
getcwd()
获取当前的工作目录并存储在path1
数组中。如果获取失败,会输出错误信息。 - 使用
chdir()
函数尝试切换到/tmp
目录。如果操作成功,会打印成功信息,失败则输出错误。 - 使用
mkdir()
创建一个新的目录/tmp/test_directory
,并设置访问权限为0755
(通常表示所有者具有读、写、执行权限,而组和其他用户有读和执行权限)。 - 最后使用
rmdir()
尝试删除刚创建的目录。如果操作成功,会打印成功信息,失败则输出错误。
确保在运行这段代码前,程序有足够的权限去执行这些操作,特别是在 /tmp
目录下创建和删除文件。
二、获取目录中文件的列表
文件存放在目录中,在处理文件之前,必须先知道目录中有哪些文件,所以要获取目录中文件的列表。
1)包含头文件
#include <dirent.h>
2)相关的库函数
步骤一:用opendir()函数打开目录。
DIR *opendir(const char *pathname);
成功-返回目录的地址,失败-返回空地址。
步骤二:用readdir()函数循环的读取目录。
struct dirent *readdir(DIR *dirp);
成功-返回struct dirent结构体的地址,失败-返回空地址。
步骤三:用closedir()关闭目录。
int closedir(DIR *dirp);
3)数据结构
目录指针:
DIR *目录指针变量名;
每次调用readdir(),函数返回struct dirent的地址,存放了本次读取到的内容。
struct dirent
{
long d_ino; // inode number 索引节点号。
off_t d_off; // offset to this dirent 在目录文件中的偏移。
unsigned short d_reclen; // length of this d_name 文件名长度。
unsigned char d_type; // the type of d_name 文件类型。
char d_name [NAME_MAX+1]; // file name文件名,最长255字符。
};
重点关注结构体的d_name和d_type成员。
d_name-文件名或目录名。
d_type-文件的类型,有多种取值,最重要的是8和4,8-常规文件(A regular file);4-子目录(A directory),其它的暂时不关心。注意,d_name的数据类型是字符,不可直接显示。
示例:
#include <iostream>
#include <dirent.h>
using namespace std;
int main(int argc,char *argv[])
{
if (argc != 2) { cout << "Using ./demo 目录名\n"; return -1; }
DIR *dir; // 定义目录指针。
// 打开目录。
if ( (dir=opendir(argv[1])) == nullptr ) return -1;
// 用于存放从目录中读取到的内容。
struct dirent *stdinfo=nullptr;
while (1)
{
// 读取一项内容并显示出来。
if ((stdinfo=readdir(dir)) == nullptr) break;
cout << "文件名=" << stdinfo->d_name << ",文件类型=" << (int)stdinfo->d_type << endl;
}
closedir(dir); // 关闭目录指针。
}