一、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. Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数

    上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...

  2. JavaScript 对数据处理的5个API

    JavaScript对数据处理包括向上取整.向下取整.四舍五入.固定精度和固定长度5种方式,分别对应ceil,floor,round,toFixed,toPrecision等5个API,本文将对这5个 ...

  3. async & await 的前世今生(Updated)

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  4. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  5. EntityFramework Core 1.1 Add、Attach、Update、Remove方法如何高效使用详解

    前言 我比较喜欢安静,大概和我喜欢研究和琢磨技术原因相关吧,刚好到了元旦节,这几天可以好好学习下EF Core,同时在项目当中用到EF Core,借此机会给予比较深入的理解,这里我们只讲解和EF 6. ...

  6. 使用SwingBench 对Oracle RAC DB性能 压力测试

    我们可以使用swingbench这个工具对数据库性能进行压力测试,得到一些性能指标作为参考. SwingBench下载: http://www.dominicgiles.com/downloads.h ...

  7. js闭包 和 prototype

    function test(){ var p=200; function q(){ return p++; } return q; } var s = test(); alert(s()); aler ...

  8. Spring注解

    AccountController .java Java代码   1.        /** 2.         * 2010-1-23 3.         */ 4.        packag ...

  9. cesium核心类Viewer简介

    1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...

  10. Android之文件数据存储

    一.文件保存数据介绍 Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的.文件可用来存放大量数据,如文本.图 ...