`

文件重命名和符号链接

阅读更多
    文件或目录可以用 rename 函数或者 renameat 函数进行重命名。
#include <stdio.h>

int rename(const char *oldname, const char *newname);
int renameat(int oldfd, const char *oldname, int newfd, const char *newname);
                  /* 返回值:若成功,都返回 0;否则,都返回 -1 */

    除了当 oldname 或 newname 指向相对路径时,这两个函数功能相同。如果 oldname 指向相对路径,就相对于 oldfd 引用的目录来计算 oldname。类似地,如果 newname 指向相对路径,就相对于 newfd 引用的目录来计算 newname。oldfd 或 newfd 都能设置成 AT_FDCWD,此时相对于当前目录来计算相应的路径名。
    根据 oldname 是指文件、目录还是符号链接,有几种情况需要讨论。
    1、如果 oldname 指的是一个文件而不是目录,那么为该文件或符号链接重命名。在这种情况下,如果 newname 已存在,则它不能引用一个目录。如果 newname 存在而且不是一个目录,则先将该目录项删除,然后将 oldname 重命名为为 newname。对包含 oldname 的目录以及包含 newname 的目录,调用进程必须具有写权限,因为将更改这两个目录。
    2、若 oldname 指的是一个目录,那么为该目录重命名。如果 newname 已存在,则它必须引用一个空目录(即只能有“.”和“..”项)。如果 newname 存在且是空目录,则先将其删除,然后将 oldname 重命名为 newname。另外,newname 不能包含 oldname 作为其路径前缀。
    3、若 oldname 或 newname 引用符号链接,则处理的是符号链接本身。
    4、不能对“.”和“..”重命名。
    5、当 oldname 和 newname 引用同一文件时,函数不做任何更改。

    符号链接是对一个文件的间接指针,而硬链接直接指向文件的 i 节点。引入符号链接是为了避开硬链接的一些限制:
    1、硬链接通常要求链接和文件位于同一文件系统。
    2、只有超级用户才能创建指向目录的硬链接(底层文件系统支持的话)。
    对符号链接以及它指向何种对象并无任何文件系统限制,任何用户都可以创建指向目录的符号链接。符号链接一般用于将一个文件或目录结构移到系统中另一个位置。
    当使用以名字引用文件的函数时,应当了解该函数是否处理符号链接,也就是是否跟随符号链接到达它所链接的文件。因为符号链接可能在文件系统中引入循环,大多数查找路径名的函数在这种情况下都将出错返回,并把 errno 值设置为 ELOOP。如下示例:
$ mkdir foo
$ touch foo/a
$ ln -s ../foo foo/testdir      # 创建一个符号链接

    此时如用类似于 Solaris 的标准函数 ftw 以降序遍历该文件结构,打印每个遇到的路径,则将输出:
foo
foo/a
foo/testdir
foo/testdir/a
foo/testdir/testdir
......                  # 更多行,直到 ftw 出错,此时 errno 值为 ELOOP

    另外,当用 open 打开文件时,如果传递的参数指定了一个符号链接,那么 open 会跟随此链接到达所指定的文件。若引用文件不存在,open 将出错返回。这有时会让不熟悉符号链接的人感到迷惑,例如:
$ ln -s /no/such/file myfile  # 创建一个指向不存在的文件的符号链接
$ ls -l myfile                # 使用 ls 命令能看到该符号链接
lrwxrwxrwx 1 sar     13 Jan 22 00:26  myfile -> /no/such/file
$ cat myfile                     # 试图查看该文件,结果报错
cat:myfile: No such file or directory

    可以用 symlink 或 symlinkat 函数创建一个符号链接。
#include <unistd.h>
int symlink(const char *actualpath, const char *sympath);
int symlinkat(const char *actualpath, int fd, const char *sympath);
                    /* 返回值:若成功,都返回 0;否则,都返回 -1 */

    函数创建了一个指向 actualpath 的新目录项 sympath,这里并不要求 actualpath 必须存在(如上面的例子所示),而且,actualpath 和 sympath 也并不需要一定位于同一文件系统中。
    symlinkat 函数类似于 symlink 函数,但 sympath 参数根据相对于打开文件描述符引用的目录(由 fd 参数指定)进行计算。如果 sympath 指定的是绝对路径或 fd 设置为 AT_FDCWD 值,那么 symlinkat 就等同于 symlink 函数。
    由于 open 函数会跟随符号链接,所以需要有一种方法打开该链接本身,并读取该链接中的名字。readlink 和 readlinkat 函数提供了这种功能。
#include <unistd.h>
ssize_t readlink(const char *restrict pathname, char *restrict buf, size_t bufsize);
ssize_t readlinkat(int fd, const char *restrict pathname, char *restrict buf, size_t bufsize);
                    /* 返回值:若成功,都返回读取的字节数;否则,都返回 -1 */

    如果函数执行成功,则返回读入 buf 的字节数,buf 中返回的符号链接的内容不以 null 字节终止。
    当 pathname 指定的是绝对路径或 fd 设置为 AT_FDCWD 值,那么 readlinkat 就等同于 readlink 函数。但是,如果 fd 是一个打开目录的有效文件描述符并且 pathname 是相对路径名,则 readlinkat 计算相对于由 fd 代表的打开目录的路径名。
分享到:
评论

相关推荐

    NTFSLinksView(显示您的所有符号链接)

    NTFS(New Technology File System)是微软Windows系统的一种高级文件系统,它引入了符号链接这一特性,允许用户创建一个指向其他文件或目录的特殊链接,类似于Unix系统中的软链接和硬链接。 符号链接是一种特殊...

    重命名小软件

    重命名小软件是一款高效实用的工具,专门设计用于帮助用户快速、批量地对文件和文件夹进行重命名操作。在日常工作中,我们经常会遇到需要整理大量文件的情况,手动逐个重命名不仅耗时且易出错,这时,重命名小软件就...

    Go-renameioGo包提供了一种原子创建或替换文件或符号链接的方法

    `renameio`包是一个非常实用的库,它为开发者提供了原子性地创建或替换文件或符号链接的能力。原子性操作意味着在多线程或多进程环境中,这些操作要么全部完成,要么全部不完成,避免了数据不一致性和竞态条件的问题...

    put:Put 是一个命令行实用程序,用于移动、重命名、复制和符号链接文件。 使用简单的占位符语法将输入文件名转换为输出文件名。 将其视为更易于使用但功能可能不那么强大的 Linux 重命名

    put是命令行实用程序,用于移动、重命名、复制和符号链接文件。 put使用简单的占位符语法将输入文件名转换为输出文件名。 将其视为更易于使用但功能可能不那么强大的 Linux rename 。 用法 # copy files put ' app/...

    mklink.exe

    如果移动或重命名了目标文件或目录,符号链接仍然有效,因为它存储的是相对路径。 2. **硬链接**:硬链接是文件系统中实际的文件条目。每个文件在文件系统中都有一个唯一的inode(文件系统索引节点),硬链接就是...

    模拟UNIX文件系统

    8. **符号链接**:UNIX支持软链接(符号链接),它是一个指向另一个文件的指针。模拟时,需要创建一个特殊的inode类型,记录目标文件的路径。 9. **硬链接**:硬链接是文件的多个入口,它们共享同一个inode。模拟时...

    两个畸形目录创建管理工具

    5. 文件移动和删除:如果原始文件或目录被移动或重命名,硬链接仍然有效,但符号链接可能失效。 了解并熟练掌握畸形目录的创建和管理对于系统管理员、开发者以及高级用户来说是非常有用的技能,可以帮助他们更好地...

    NIO2基础介绍

    但是,在重命名或删除符号链接时,只会重命名和删除符号链接本身,而不会影响目标文件。 Path类是NIO2中的一个抽象类,提供了许多方法来操作文件和文件夹,包括创建、删除、复制、移动等。Path类可以在任何文件系统...

    linux系统工常用指令文件管理实用教案.ppt

    - `mv file1 newfile` 会将名为`file1`的文件重命名为`newfile`。 - `mv dir1 newdir` 会将名为`dir1`的目录重命名为`newdir`。 - `-f` 参数表示强制覆盖,如果目标位置已经有同名文件或目录,不询问直接覆盖。 ...

    使用脚本实现自动清除指定文件夹下丢失链接文件的符号链接

    然而,在实际使用过程中,可能会出现原目标文件或目录被移动、重命名或删除的情况,导致符号链接失效,成为所谓的“丢失链接”(broken links)。这些无效的符号链接不仅占用磁盘空间,还可能影响系统的整洁度和管理...

    linux_fileSystem.zip_linux 文件系统_linux文件系统_sum3xd

    Linux文件系统还支持硬链接和软链接(符号链接)。硬链接指向文件的inode,而软链接则创建一个指向其他文件路径的新文件。这在某些场景下,如备份、文件重命名等,提供了便利。 最后,日志型文件系统(如EXT3、EXT4...

    junction ntfs link

    符号链接允许你在文件系统中创建“软”连接,这意味着即使目标文件在其他位置移动或重命名,链接依然有效。这在软件开发中尤其有用,因为可以轻松地在不同项目之间共享库或配置文件。 在提供的压缩包中,"junction....

    RealView编译工具(4.0版)链接器用户指南

    - **链接模型**:链接器支持不同的链接模型,包括静态链接和动态链接。静态链接是指在构建最终可执行文件时将所有依赖库直接合并到可执行文件中的过程;而动态链接则是在运行时动态加载所需库的过程。 - **命令行...

    用于将文件移动(或重命名)到新位置并将其所有符号链接重定向到新路径的 CLI 实用程序

    移动链接CLI 实用程序将您的文件移动(或重命名)到新位置并将其所有符号链接重定向到新路径(或名称)。用法执行mvl --help以显示帮助信息Move Links Ben Mefteh F. &lt;[email protected] &gt; Move (or rename) ...

    Linux文件和目录操作命令

    - **符号链接(软链接)**:创建指向文件路径的链接。 - `ln -s source_file link_name`:为source_file创建符号链接link_name。 ##### 3.4 查看文件内容 - **cat**:连接并打印文件内容。 - `cat file_name`:...

    模拟UNIX系统的文件管理功能

    模拟这两者需要理解和使用`symlink()`(创建符号链接)和`link()`(创建硬链接)系统调用。 8. **文件I/O**: UNIX系统提供了丰富的文件读写操作,如`fopen()`、`fread()`、`fwrite()`、`fclose()`等。模拟这些...

    Linux文件系统的管理方法.pdf

    硬链接是指两个或更多个链接指向同一块数据,而软链接(符号链接)类似于Windows的快捷方式,它创建了一个指向另一个文件的新文件。硬链接不允许跨越文件系统,而软链接则可以。 文件系统的配置涉及到挂载和卸载。...

    操作系统课程设计(二级文件的管理)

    - 实现硬链接和符号链接 - 模拟文件打开和关闭操作 - 处理文件的读写请求(尽管不涉及实际写入硬盘) 通过这样的课程设计,学生可以加深对操作系统如何管理和维护文件的理解,这对于未来从事系统编程、内核开发或者...

    7文件管理.doc

    文件共享可以通过树形结构、索引结点链接或符号链接实现。树形结构便于组织文件并共享子目录,但删除操作需小心;索引结点链接直接指向文件,但删除可能导致空指针;符号链接则以路径形式共享,虽然查找步骤多,但更...

Global site tag (gtag.js) - Google Analytics