[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时,此字段被自动更新。
转载于:https://www.cnblogs.com/orlion/p/6218557.html
[APUE]文件和目录(中)相关推荐
- php获取目录文件 排序输出,php实现对文件夹目录中的文件进行排序的方法
php实现对文件夹目录中的文件按照时间.名称.大小进行排序的方法 函数介绍: opendir() 函数打开目录句柄. readdir() 函数返回目录中下一个文件的文件名. array_multiso ...
- python 打开当前目录的txt文件-Python - 读取其他文件夹/目录中的文本文件
这是我的情况:我有一些.txt文件在我可以运行脚本的不同目录中.Python - 读取其他文件夹/目录中的文本文件 mainDir/ -face/ -57268-face-_tracker.txt - ...
- 文件和目录中的 . 与 .. 与 / 表示含义
文件和目录中的 . 与 .. 与 / 表示含义 前言 文件系统 文件名 路径名 前言 . 与 .. 与 / 是文件系统中的特殊字符. 文件系统 文件系统是目录和文件的一种层次结构. 其中 ...
- linux 中w和x 区别,r、w、x权限在文件和目录中的含义有何区别?
age 于 2011-01-11 17:48:39发表: 目录和文件的rw权限基本一致, 唯一有区别的可能就是执行权限了 文件的可执行权限很好理解, 最简单的理解就是可以在终端下输入路径来执行这个文件 ...
- python在当前目录创建txt文件-python-在目录中创建多个文本文件的字数字...
使用collections.Counter. 示例文件: /tmp/foo.txt hello world hello world foo bar foo bar baz /tmp/bar.txt h ...
- python创建多个txt文件-python-在目录中创建多个文本文件的字数字...
使用collections.Counter. 示例文件: /tmp/foo.txt hello world hello world foo bar foo bar baz /tmp/bar.txt h ...
- 如何忽略Git中目录中的文件?
本文翻译自:How do I ignore files in a directory in Git? What is the proper syntax for the .gitignore file ...
- java获取目录中最后被更改的文件_如何使用Java从目录中只获取10个最后修改过的文件?...
我是初学者,我发现了一个关于 java中lastmodified文件的旧线程. 我想要的是从目录中只获取10个最近的文件并将它们移动到另一个目录. 在此论坛中找到的此代码运行良好,但它从目录中获取所有 ...
- linux 复制指定目录下的全部文件到另一个目录中,linux cp 文件夹
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. linux复制指定目录下的全部文件到另一个目录中 复制指定目录下的全部文件到另一个目录中 文件及目录 ...
最新文章
- 英伟达官宣:CUDA 将不再支持 macOS
- Table tr td th表格使用案例
- 【译】光线跟踪:理论与实现(一) 简介
- 003Java语言环境搭建
- P4424-[HNOI/AHOI2018]寻宝游戏【结论】
- PHPMailer目录和命名空间没有错,但是始终class not found,的原因和解决方法
- python编写排列组合,密码生产功能
- 只要沾上婚恋焦虑,她们就王者变青铜
- 别让for循环毁了你的程序(一)
- mysql weindow 安装_windows下怎么安装mysql
- eBPF学习记录(三)使用BCC开发eBPF程序
- 深入 AI 之前,你需要学习的服务与框架
- 前端代码审查工具_前端代码审查中应检查的内容
- 最小二乘法(least squares)的曲线拟合(curve fitting)
- ASP.NET删除服务器端文件,asp.net删除服务器文件
- oracle现金流量表逻辑,财务学习:现金流量表内在逻辑研究
- 【coq】函数语言设计 练习题inductionlists 总结
- win7回收站右键没有清空回收站选项
- 由“戴尔用博客与中国用户沟通”想起
- Xmind怎么打开?在线转换成PNG,JPG图片格式,无需安装其他软件