一、link、unlink、remove和rename

  1. 一个文件可以有多个目录项指向其i节点。使用link函数可以创建一个指向现存文件连接
#include <unistd.h>
int link(const char *existingpath, const char *newpath); 返回值:成功为0,出错为-1

该函数创建一个新目录项newpath,指向现存文件existingpath,如果newpath已存在则返回出错。

  1. 为了删除一个现存的目录项,可以调用unlnk函数。
#include <unistd.h>
int unlink(const char *pathname); 返回值:成功为0,出错为-1

此函数删除目录项,并将pathname引用的文件的连接计数-1。 只有当连接计数达到0时该文件的内容才能被删除,如果有进程打开了该文件其内容也不能删除。关闭一个文件时内核首先检查使该文件打开的进程计数,如果该计数为0再检查连接计数,如果为0那就删除该文件。

  1. 使用remove函数可以解除对一个文件或目录的连接,对于文件,remove的功能与unlink相同。对于目录,remove的功能与rmdir相同。
#include <stdio.h>
int remove(const char *pathname);
  1. 文件或目录用rename函数重命名
#include <stdio.h>
int rename(const char *oldname, const char *newname);

根据oldname是目录还是文件有两种情况:

  (1) 如果oldname是一个文件则为该文件更名。在这种情况下,如果newname已存在,则它不能引用一个目录。如果newname已存在,而且不是一个目录,则先将该目录项(这里不是目录!)删除然后将oldname更名为newname。对包含oldname和newname的目录,调用进程必须具有写权限,因为将更改这两个目录。

  (2) 如果oldname说明一个目录,那么为该目录重命名。如果newname已存在,则它必须引用一个目录,而且该目录应当是空目录。如果newname存在而且是一个空目录,则先将其删除,然后将oldname更名为newname。不能将/usr/foo更名为/usr/foo/dir,因为oldname /usr/foo是newname /usr/foo/dir的前缀,无法删除。可以将/tmp/orlion/b/(假如该文件夹下有个c文件)更名为/tmp/orlion_1/,修改完成后可以看到orlion_1文件夹下有个c文件。

  (3) 如果oldname和newname引用同一个文件,则不做任何修改而返回成功。 如果newname已存在,则进程必须需要对其有写权限(如同删除一样)。另外进程将删除oldname目录项,并可能要创建newname目录项,所以它需要对包含oldname及包含newname的目录具有写和执行权。

二、符号连接

符号链接是对一个文件的间接指针。rmdir函数如果path是符号链接则返回出错,所以下表没有列出各个函数对符号连接的处理如下:

  

三、symlink和readlink函数

symlink函数创建一个符号连接。

#include <unistd.h>
int symlink(const char *actualpath, const char *sympath);

在创建符号连接时并不要求actualpath存在。并且不要求actualpath和sympath在同一文件系统中而硬连接要求。 因为open函数会跟随符号连接(即实际打开的是符号连接连接的文件),所以需要一种方法打开该连接本身,readlink提供了这种功能。

#include <unistd.h>
int readlink(const char *pathname, char *buf, int bufsize);

此函数组合了open,read和close的所有操作。 如果成功则返回读入buf的字节数如果失败则返回-1。在buf返回的文件链接的内容不以null字符终止。

四、文件的时间

每个文件有三个时间段,如下图:

  

下表是各种函数对这三个时间的作用。 目录是包含目录项(文件名和相关的i节点)的文件,增加、删除或修改目录项会影响到与其所在目录相关的三个时间。例如,创建一个新文件会影响到包含该文件的目录(因为目录实质上是包含该文件的文件),也影响新文件的i节点,但是读或写只影响该文件的i节点,而对父目录则无影响。

  

五、utime函数

一个文件的存取和修改时间可以用utime函数更改。

#include <sys/types.h>
int utime(const char *pathname, const struct utimbuf *times); 返回值:成功0,失败-1.

此函数所使用的结构是:

struct utimbuf {time_t actime; /* access time */time_t modtime; /* modification time */ }

结构体中的两个时间都是unix时间戳。

此函数的操作以及执行它所要求的优先权取消于times参数是否是NULL。

  (1) 如果times是一个空指针,则存取时间和修改时间两者都设置为当前时间。为了执行次操作必须满足两条件之一(a)进程的有效用户ID必须等于该文件的所有者ID,(b)进程对该文件必须具有写许可权。

  (2) 如果times是非空指针,则存取时间和修改时间被设置为times所指向的结构体中的值。此时,进程的有效用户ID必须等于该文件的所有者或者进程是一个root进程。对文件只有写权限是不够的。

不能修改文件的状态时间st_ctime,当调用utime时,此字段被自动更新。

转载于:https://www.cnblogs.com/orlion/p/6218557.html

[APUE]文件和目录(中)相关推荐

  1. php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法

    php实现对文件夹目录中的文件按照时间.名称.大小进行排序的方法 函数介绍: opendir() 函数打开目录句柄. readdir() 函数返回目录中下一个文件的文件名. array_multiso ...

  2. python 打开当前目录的txt文件-Python - 读取其他文件夹/目录中的文本文件

    这是我的情况:我有一些.txt文件在我可以运行脚本的不同目录中.Python - 读取其他文件夹/目录中的文本文件 mainDir/ -face/ -57268-face-_tracker.txt - ...

  3. 文件和目录中的 . 与 .. 与 / 表示含义

    文件和目录中的 . 与 .. 与 / 表示含义 前言 文件系统 文件名 路径名 前言    . 与 .. 与 / 是文件系统中的特殊字符. 文件系统   文件系统是目录和文件的一种层次结构.   其中 ...

  4. linux 中w和x 区别,r、w、x权限在文件和目录中的含义有何区别?

    age 于 2011-01-11 17:48:39发表: 目录和文件的rw权限基本一致, 唯一有区别的可能就是执行权限了 文件的可执行权限很好理解, 最简单的理解就是可以在终端下输入路径来执行这个文件 ...

  5. python在当前目录创建txt文件-python-在目录中创建多个文本文件的字数字...

    使用collections.Counter. 示例文件: /tmp/foo.txt hello world hello world foo bar foo bar baz /tmp/bar.txt h ...

  6. python创建多个txt文件-python-在目录中创建多个文本文件的字数字...

    使用collections.Counter. 示例文件: /tmp/foo.txt hello world hello world foo bar foo bar baz /tmp/bar.txt h ...

  7. 如何忽略Git中目录中的文件?

    本文翻译自:How do I ignore files in a directory in Git? What is the proper syntax for the .gitignore file ...

  8. java获取目录中最后被更改的文件_如何使用Java从目录中只获取10个最后修改过的文件?...

    我是初学者,我发现了一个关于 java中lastmodified文件的旧线程. 我想要的是从目录中只获取10个最近的文件并将它们移动到另一个目录. 在此论坛中找到的此代码运行良好,但它从目录中获取所有 ...

  9. linux 复制指定目录下的全部文件到另一个目录中,linux cp 文件夹

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. linux复制指定目录下的全部文件到另一个目录中 复制指定目录下的全部文件到另一个目录中 文件及目录 ...

最新文章

  1. 英伟达官宣:CUDA 将不再支持 macOS
  2. Table tr td th表格使用案例
  3. 【译】光线跟踪:理论与实现(一) 简介
  4. 003Java语言环境搭建
  5. P4424-[HNOI/AHOI2018]寻宝游戏【结论】
  6. PHPMailer目录和命名空间没有错,但是始终class not found,的原因和解决方法
  7. python编写排列组合,密码生产功能
  8. 只要沾上婚恋焦虑,她们就王者变青铜
  9. 别让for循环毁了你的程序(一)
  10. mysql weindow 安装_windows下怎么安装mysql
  11. eBPF学习记录(三)使用BCC开发eBPF程序
  12. 深入 AI 之前,你需要学习的服务与框架
  13. 前端代码审查工具_前端代码审查中应检查的内容
  14. 最小二乘法(least squares)的曲线拟合(curve fitting)
  15. ASP.NET删除服务器端文件,asp.net删除服务器文件
  16. oracle现金流量表逻辑,财务学习:现金流量表内在逻辑研究
  17. 【coq】函数语言设计 练习题inductionlists 总结
  18. win7回收站右键没有清空回收站选项
  19. 由“戴尔用博客与中国用户沟通”想起
  20. Xmind怎么打开?在线转换成PNG,JPG图片格式,无需安装其他软件

热门文章

  1. 检查单 2014-06-20-01
  2. 转-linux系统脚本 环境变量 的启动顺序
  3. shell学习之shell基础知识了解
  4. Oracle对数据的导出和导入,建立用户,删除用户以及其下的所有表
  5. 水木-搜索引擎技术版
  6. window 下Eclipse c++的开发环境配置
  7. Upgrading PHP on CentOS 6.5 (Final)
  8. 高效搭建Storm全然分布式集群
  9. 我很高兴找了一张可以说明:为什么软件开发那么困难的图
  10. 面试技巧——保持一颗乐观的心态