当前位置:首页 > 技术文章 > 正文内容

Linux系统编程之目录操作(linux目录结构及文件基本操作)

douba31个月前 (07-24)技术文章6

概述

在Linux系统中,文件系统是组织和管理数据的关键组件,而目录则是文件系统的骨架。目录本质上是一个特殊的文件,包含了指向其他文件或目录的链接。每个目录都有一个唯一的inode号,用来标识它在文件系统中的位置。目录可以包含普通文件、其他目录(子目录)、符号链接、其他类型的文件(比如:设备文件等)。


创建目录

创建目录是一项基本任务,可以通过mkdir函数来实现。其函数原型如下。

int mkdir(const char *path, mode_t mode);

path:指向要创建的目录路径名的指针,可以是绝对路径(从根路径“/”开始),也可以是相对路径(相对于当前工作目录)。

mode:目录的权限模式,可使用符号常量S_IRUSR、S_IWUSR、S_IXUSR等来指定。通常情况下,我们会直接写成八进制数。比如:0755表示所有者有读、写、执行权限,而组用户和其他人只有读和执行权限。

返回值:成功时返回0,失败时返回-1,并设置errno来指示具体的错误类型。

在下面的示例代码中,我们在当前目录下创建了一个名为“hope_wisdom”的子目录,并设置了适当的权限。

#include <sys/stat.h>
#include <sys/types.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
    const char* pszDirPath = "./hope_wisdom";
    // 设置新目录的权限为:rwxr-xr-x
    mode_t permissions = 0755;
    if (mkdir(pszDirPath, permissions) == -1)
    {
        printf("Dir created failed: %s\n", strerror(errno));
    }
    else
    {
        printf("Dir created successfully\n");
    }
    
    return 0;
}


删除空目录

当需要删除一个空目录时,可以使用rmdir函数。需要特别注意的是:该函数只能删除空目录,如果目录中有文件或子目录,则会失败。其函数原型如下。

int rmdir(const char *pathname);

pathname:指向要删除的空目录路径名的指针,可以是绝对路径(从根路径“/”开始),也可以是相对路径(相对于当前工作目录)。

返回值:成功时返回0,失败时返回-1,并设置errno来指示具体的错误类型。

在下面的示例代码中,我们尝试在当前目录下删除一个名为“hope_wisdom”的子目录。

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

int main()
{
    const char* pszDirPath = "./hope_wisdom";
    if (rmdir(pszDirPath) == -1)
    {
        printf("Dir removed failed: %s\n", strerror(errno));
    }
    else
    {
        printf("Dir removed successfully\n");
    }
    
    return 0;
}


获取/改变当前工作目录

getcwd函数用于获取当前的工作目录,这对于记录程序运行的位置或恢复之前的工作目录非常有用。有时候,我们可能需要改变程序的工作目录(比如:切换到某个特定的路径下执行命令),这时就可以使用chdir函数。这两个函数的原型如下。

char *getcwd(char *buf, size_t size);

int chdir(const char *path);

getcwd函数各个参数和返回值的含义如下。

buf:一个指向缓冲区的指针,用于存放返回的绝对路径。如果这个参数为NULL,则getcwd会分配足够的内存来存储路径,并返回指向这块内存的指针(此时,需要调用者负责释放)。

size:缓冲区的大小。如果buf是NULL,该参数将被忽略。

返回值:成功时返回buf,即包含当前工作目录绝对路径的指针。失败时返回NULL,并设置errno来指示具体的错误类型。

chdir函数各个参数和返回值的含义如下。

path:指向新工作目录路径名的指针,可以是绝对路径或相对路径。

返回值:成功时返回0,失败时返回-1,并设置errno来指示具体的错误类型。

在下面的示例代码中,我们先通过getcwd函数获取了当前工作目录,然后通过chdir函数修改了当前工作目录为“hope_wisdom”。

#include <unistd.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include <limits.h>

int main()
{
    char pszDir[PATH_MAX];
    if (getcwd(pszDir, sizeof(pszDir)) != NULL)
    {
        printf("Current working directory: %s\n", pszDir);
    }
    else
    {
        printf("getcwd failed\n");
    }
    
    if (chdir("./hope_wisdom") == -1)
    {
        printf("chdir failed: %s\n", strerror(errno));
    }
    else
    {
        printf("chdir OK\n");
    }

    return 0;
}

注意:使用chdir函数改变工作目录后,所有相对路径的文件访问都将基于新的工作目录。另外,如果程序以多线程方式运行,需要注意多个线程共享相同的当前工作目录的情况。这是因为,此时可能会导致不可预测的行为。

相关文章

ToDesk Linux更新发布:新增摄像头、网络诊断

ToDesk更新来了!最新版Liunx-4.3.0.0针对Linux用户上新了摄像头、网络诊断等多种实用功能,大幅提升了用户使用体验。并且ToDesk全面支持国产三大操作系统——麒麟、统信、方德,为L...

本地部署宝塔平替轻量级linux面板mdserver-web并实现远程访问

前言在服务器管理的世界里,宝塔面板一直是很多人的首选。它以其简洁的操作界面和丰富的功能赢得了无数用户的青睐。然而,随着时间的推移,一些用户开始对宝塔的一些限制感到不满,比如强制绑定手机号、广告频繁等问...

【入门】linux服务器查看mysql相关的信息

查看mysql版本mysql --version查看mysql的运行状态systemctl status mysqld查看mysql安装目录which mysql # 输出示例:/usr/bin/my...

Linux 的这几种搜索方式,你都会了吗?

1.find 命令find 命令是用来在给定的目录下查找符合给定条件的文件语法格式:find [查找起始路径] [查找条件] [处理动作](1)根据名称查找:find [查找起始路径] -name 文...

linux 查看磁盘信息的常用命令(linux中查看磁盘的命令)

在Linux系统中,排查磁盘问题是一个非常重要的任务,以下是一些常用的Linux排查磁盘问题的命令:df:查看磁盘分区的使用情况,可以查看磁盘分区的总容量、已用容量、可用容量等。du:查看文件或目录的...

如何在 Linux 中将 FTP 用户限制为目录

1. 概述在本文中,将配置 vsftpd 以限制用户在通过 FTP 建立连接时浏览父目录。将通过创建 FTP 用户并修改 vsftpd.conf 文件中的默认配置来实现这一点。2. 设置 FTP 用户...