一、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时,此字段被自动更新。

[APUE]文件和目录(中)的更多相关文章

  1. Java学习-043-获取文件在目录中的路径

    我们在日常的电脑使用中,经常需要在当前目录或当期目录及其子目录中查找文件,并获取相应的文件路径名.在我们的自动化测试中,也经常需要确认文件在目录中是否成功生成或已存在,因而我写了一个小方法来实现. 获 ...

  2. [APUE]文件和目录(下)

    一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...

  3. [APUE]文件和目录(上)

    一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...

  4. PHP中统计目录中文件以及目录中目录的大小

    <?php  #循环遍历目录中所有的文件,并统计目录和文件的大小  $dirName="phpMyAdmin";  $dir=opendir($dirName);  #返回一 ...

  5. Python开发【笔记】:从海量文件的目录中获取文件名--方法性能对比

    Python获取文件名的方法性能对比 前言:平常在python中从文件夹中获取文件名的简单方法   os.system('ll /data/')   但是当文件夹中含有巨量文件时,这种方式完全是行不通 ...

  6. APUE 文件和目录

    文件和目录 Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息. #include <sys/stat.h> struct stat { mode_t st_ ...

  7. APUE ☞ 文件和目录

    粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...

  8. linux复制指定目录下的全部文件到另一个目录中

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

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

    linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...

随机推荐

  1. RxJS + Redux + React = Amazing!(译一)

    今天,我将Youtube上的<RxJS + Redux + React = Amazing!>翻译(+机译)了下来,以供国内的同学学习,英文听力好的同学可以直接看原版视频: https:/ ...

  2. 【深入浅出jQuery】源码浅析--整体架构

    最近一直在研读 jQuery 源码,初看源码一头雾水毫无头绪,真正静下心来细看写的真是精妙,让你感叹代码之美. 其结构明晰,高内聚.低耦合,兼具优秀的性能与便利的扩展性,在浏览器的兼容性(功能缺陷.渐 ...

  3. TODO:GitHub创建组织的步骤

    TODO:GitHub创建组织的步骤 使用GitHub进行团队合作,写这个步骤主要作用是为了OneTODO作为一个团队组织进行代码的分享,让更多人来参与. 使用帐号.密码登录GitHub 2.右上角加 ...

  4. Sublime的使用

    1.一个可扩展性强的编辑工具 2.如何安装扩展 通过View->Show Console菜单打开命令行. 按图操作: 在控制台输入,然后回车: import urllib.request,os; ...

  5. [干货来袭]MSSQL Server on Linux预览版安装教程(先帮大家踩坑)

    前言 昨天晚上微软爸爸开了全国开发者大会,会上的内容,我就不多说了,园子里面很多.. 我们唐总裁在今年曾今透漏过SQL Server love Linux,果不其然,这次开发者大会上就推出了MSSQL ...

  6. WPF 捕获键盘输入事件

    最近修改的一个需求要求捕获键盘输入的 Text,包括各种标点符号. 最开始想到的是 PreviewKeyDown 或者 PreviewKeyUp 这样的键盘事件. 但是这两个事件的对象 KeyEven ...

  7. psoc学习

    第一是:项目的路径需要放在Documents and Settings\,也就是默认的文件夹的地方,不然会报错错误范例为:Question:CY8CKIT-023 kit example projec ...

  8. 微信小程序体验(1):携程酒店机票火车票

    在 12 月 28 日微信公开课上,张小龙对微信小程序的形态进行了阐释,小程序有四个特定:无需安装.触手可及.用完即走.无需卸载. 由于携程这种订酒店.火车票和机票等工具性质非常强的服务,非常符合张小 ...

  9. 微信小程序监控 - HotApp统计

    HotApp小程序统计,第一个专业的微信第三方小程序监控统计工具 1.什么是HotApp小程序统计 HotApp小程序统计是第一个微信第三方小程序统计工具,就像做android 和 ios开发的人知道 ...

  10. 远程连接mysql 1130错误解决方法