[APUE]文件和目录(中)
一、link、unlink、remove和rename
- 一个文件可以有多个目录项指向其i节点。使用link函数可以创建一个指向现存文件连接
#include <unistd.h>
int link(const char *existingpath, const char *newpath);
返回值:成功为0,出错为-1
该函数创建一个新目录项newpath,指向现存文件existingpath,如果newpath已存在则返回出错。
- 为了删除一个现存的目录项,可以调用unlnk函数。
#include <unistd.h>
int unlink(const char *pathname);
返回值:成功为0,出错为-1
此函数删除目录项,并将pathname引用的文件的连接计数-1。 只有当连接计数达到0时该文件的内容才能被删除,如果有进程打开了该文件其内容也不能删除。关闭一个文件时内核首先检查使该文件打开的进程计数,如果该计数为0再检查连接计数,如果为0那就删除该文件。
- 使用remove函数可以解除对一个文件或目录的连接,对于文件,remove的功能与unlink相同。对于目录,remove的功能与rmdir相同。
#include <stdio.h>
int remove(const char *pathname);
- 文件或目录用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]文件和目录(中)的更多相关文章
- Java学习-043-获取文件在目录中的路径
我们在日常的电脑使用中,经常需要在当前目录或当期目录及其子目录中查找文件,并获取相应的文件路径名.在我们的自动化测试中,也经常需要确认文件在目录中是否成功生成或已存在,因而我写了一个小方法来实现. 获 ...
- [APUE]文件和目录(下)
一.mkdir和rmdir函数 #include <sys/types.h> #include <sys/stat.h> int mkdir(const char *pathn ...
- [APUE]文件和目录(上)
一.文件权限 1. 各种ID 我在读这一章时遇到了各种ID,根据名字完全不清楚什么意思,幸好看到了这篇文章,http://blog.csdn.net/ccjjnn19890720/article/de ...
- PHP中统计目录中文件以及目录中目录的大小
<?php #循环遍历目录中所有的文件,并统计目录和文件的大小 $dirName="phpMyAdmin"; $dir=opendir($dirName); #返回一 ...
- Python开发【笔记】:从海量文件的目录中获取文件名--方法性能对比
Python获取文件名的方法性能对比 前言:平常在python中从文件夹中获取文件名的简单方法 os.system('ll /data/') 但是当文件夹中含有巨量文件时,这种方式完全是行不通 ...
- APUE 文件和目录
文件和目录 Unix 所有的文件都对应一个 struct stat,包含了一个文件所有的信息. #include <sys/stat.h> struct stat { mode_t st_ ...
- APUE ☞ 文件和目录
粘着位(Sticky Bit) S_ISVTX位被称为粘着位.如果一个可执行程序文件的这一位被设置了,程序第一次运行完之后,程序的正文部分的一个副本仍被保存在交换区(程序的正文部分是机器指令).这使得 ...
- linux复制指定目录下的全部文件到另一个目录中
linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...
- linux复制指定目录下的全部文件到另一个目录中,linux cp 文件夹
linux复制指定目录下的全部文件到另一个目录中复制指定目录下的全部文件到另一个目录中文件及目录的复制是经常要用到的.linux下进行复制的命令为cp.假设复制源目录 为 dir1 ,目标目录为dir ...
随机推荐
- Spark RDD 核心总结
摘要: 1.RDD的五大属性 1.1 partitions(分区) 1.2 partitioner(分区方法) 1.3 dependencies(依赖关系) 1.4 compute(获取分区迭代列表) ...
- PHP赋值运算
1. 赋值运算:= ,意思是右边表达式的值赋给左边的运算数. $int1=10; $int1=$int1-6; //$int1=4 echo $int1,"<br>"; ...
- Zabbix基本配置及监控主机
监控主机一版需要在被监控的主机上安装Zabbix Agent 监控主机 安装zabbix-agent 首先需要在被监控的主机上安装agent,可以下载预编译好的RPM进行安装,下载地址:http:// ...
- webpack+react+redux+es6开发模式
一.预备知识 node, npm, react, redux, es6, webpack 二.学习资源 ECMAScript 6入门 React和Redux的连接react-redux Redux 入 ...
- Asp.Net 操作XML文件的增删改查 利用GridView
不废话,直接上如何利用Asp.NET操作XML文件,并对其属性进行修改,刚开始的时候,是打算使用JS来控制生成XML文件的,但是最后却是无法创建文件,读取文件则没有使用了 index.aspx 文件 ...
- python之浅拷贝和深拷贝
1.浅拷贝 1>赋值:从下面的例子我们可以看到赋值之后新变量的内存地址并没有发生任何变化,实际上python中的赋值操作不会开辟新的内存空间,它只是复制了新对象的引用,也就是说除了b这个名字以外 ...
- 打造TypeScript的Visual Studio Code开发环境
打造TypeScript的Visual Studio Code开发环境 本文转自:https://zhuanlan.zhihu.com/p/21611724 作者: 2gua TypeScript是由 ...
- ABP架构设计交流群-上海线下交流会的内容分享(有高清录像视频的链接)
点这里进入ABP系列文章总目录 ABP架构设计交流群-7月18日上海线下交流会内容分享 因为最近工作特别忙,很久没有更新博客了,真对不起关注我博客和ABP系列文章的朋友! 原计划在7月11日举行的AB ...
- ABP源码分析四十五:ABP ZERO中的EntityFramework模块
AbpZeroDbContext:配置ABP.Zero中定义的entity的Dbset EntityFrameworkModelBuilderExtensions:给PrimitiveProperty ...
- ABP框架 - 领域事件(EventBus)
文档目录 本节内容: EventBus 注入 IEventBus 获取默认实例 定义事件 预定义事件 处理完异常 实体修改 触发事件 处理事件 处理基类事件 处理程序异常 处理多个事件 处理程序注册 ...