linux 文件长度 文件截断 rename renameat

文件长度

stat结构成员st_size表示以字节为单位的文件的长度。此字段只对普通文件、目录文件和符号链接文件有意义。

对于普通文件,其文件长度可以是0,在开始读这种文件时,将得到文件结束指示。

对于目录,文件长度通常是一个数的整倍数。

对于符号链接,文件长度是在文件名中的实际字节数。例如,在下面的例子中,文件长度15就是路径名/usr/lib的长度:

lrwxrwxrwx  1 root root      15 2014-05-12 17:00 libz.so.1 -> libz.so.1.2.3.3
(注意,因为符号链接文件长度总是由st_size指示,所以它并不包含通常C语言做名字结尾的null字节)
现今,大多数现代的UNIX系统提供字段st_blksize和st_blocks,其中,第一个是对文件I/O较合适的快长度,第二个是所分配的数据512字节块数。为了提高效率,标准I/O库也试图一次读、写st_blksize个字节。

文件截断

有时我们需要在文件尾端处截取一些数据以缩短文件。将一个文件的长度截断为0是一个特例,在打开文件时使用O_TRUNC标志可以做到这一点。为了截断文件可以调用函数truncate和ftruncate。

#include <unistd.h>
int truncate(const char *pathname, off_t length);
int ftruncate(int fd, off_t length);
                                                                连个函数的返回值:若成功,返回0;若出错,返回-1
这两个函数将一个现有文件长度截断为length。如果该文件以前的长度大于length,则超过length以外的数据就不再能访问。如果以前的长度小于length,文件长度将增加,在以前的文件尾端和新文件的尾端之间的数据将作为0。

函数rename和renameat

文件或目录可以用rename函数或者renameat函数进行重命名。

#include <stdio.h>
int rename(const char *oldname, const char *newname);
int renameat(int oldfd,const char *oldname, int newfd, const char *newname);
                                                                              两个函数的返回值:若成功,返回0;若出错,返回-1
根据oldname是指文件、目录还是符号链接,有几种情况需要加以说明。

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

(2)如若oldname指的是一个目录,那么为该目录重命名。如果newname已存在,则它必须引用一个目录,而且该目录应当是空目录(空目录指只有.和..项)。如果newname存在(而且是一个新目录),则先将其删除,然后将oldname重命名为newname。另外,当为一个目录重命名时,newname不能包含oldname作为其路径名字的路径前缀。例如,不能将/usr/foo重命名为/usr/foo/testdir,因为旧名字(/usr/foo)是新名字的路径前缀,因而不能将其删除。

(3)如若oldname或newname引用符号链接,则处理的是符号链接本身,而不是它所引用的文件。

(4)不能对.和..重命名。更确切的说,.和..都不能出现在oldname和newname的最后部分。

(5)作为一个特例,如果oldname和newname引用同一文件,则函数不做任何更改而成功返回。

如若newname已经存在,则调用进程对它需要有写权限。另外,调用进程将删除oldname目录项,并可能要创建newname目录项,所以它需要对包含的oldname及包含newname的目录具有写和执行权限。

除了当oldname或newname指向相对路径名时,其他情况下renameat函数与rename函数功能相同。如果oldname参数指定了相对路径,就相对于oldfd参数引用的目录来计算oldname。类似的,如果oldname参数指定了相对路径,就相对于newfd引用的目录来计算newname。oldfd或newfd参数都能设置成AT_FDCWD,此时相对于当前目录来计算相应的路径名。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值