Linux的目录操作

一、几个简单的目录操作函数

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_named_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);   // 关闭目录指针。
}

  • 15
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值