首页 > 代码库 > 文件操作 之 各类函数

文件操作 之 各类函数

chmod

头函数:
#include < sys/stat.h>

函数定义:
int chmod(const char *path, mode_t mode);
int fchmod(int fd, mode_t mode);

函数说明:
chmod()会依参数mode 权限来更改参数path 指定文件的权限。
fchmod()会依参数mode 权限来更改参数fd 所指文件的权限。参数fd 为已打开文件的文件描述符。参数mode 和chmod ()函数一致。

返回值:
权限改变成功则返回0, 失败返回-1, 错误原因存于errno

参数 mode 有下列数种组合:
S_ISUID 04000 文件的 (set user-id on execution)位
S_ISGID 02000 文件的 (set group-id on execution)位
S_ISVTX 01000 文件的sticky 位
S_IRUSR 00400 文件所有者具可读取权限
S_IWUSR 00200 文件所有者具可写入权限
S_IXUSR 00100 文件所有者具可执行权限
S_IRGRP 00040 用户组具可读取权限
S_IWGRP 00020 用户组具可写入权限
S_IXGRP 00010 用户组具可执行权限
S_IROTH 00004 其他用户具可读取权限
S_IWOTH 00002 其他用户具可写入权限
S_IXOTH 00001 其他用户具可执行权限

错误代码:
EPERM 进程的有效用户识别码与欲修改权限的文件拥有者不同, 而且也不具root 权限.
EACCESS 参数path 所指定的文件无法存取.
EROFS 欲写入权限的文件存在于只读文件系统内.
EFAULT 参数path 指针超出可存取内存空间.
EINVAL 参数mode 不正确
ENAMETOOLONG 参数path 太长
ENOENT 指定的文件不存在
ENOTDIR 参数path 路径并非一目录
ENOMEM 核心内存不足
ELOOP 参数path 有过多符号连接问题.
EIO I/O 存取错误

 

chown

#include <unistd.h>

int chown(const char *path, uid_t owner, gid_t group);
int fchown(int fd, uid_t owner, gid_t group);
int lchown(const char *path, uid_t owner, gid_t group);

函数说明:chown()会将参数path 指定文件的所有者变更为参数owner 代表的用户,而将该文件的组变更为参数group 组。如果参数owner 或group 为-1,对应的所有者或组不会有所改变。root 与文件所有者皆可改变文件组,但所有者必须是参数group 组的成员。当root 用chown()改变文件所有者或组时,该文件若具有S_ISUID或S_ISGID 权限,则会清除此权限位,此外如果具有S_ISGID 权限但不具S_IXGRP 位,则该文件会被强制锁定,文件模式会保留。

返回值:成功则返回0, 失败返回-1, 错误原因存于errno

utime

#include <sys/types.h>
#include <utime.h>

int utime(const char * filename, struct utimbuf * buf);

函数说明:utime()用来修改参数filename 文件所属的inode 存取时间。结构utimbuf 定义如下:
struct utimbuf
{
time_t actime;
time_t modtime;
};

返回值:如果参数buf 为空指针(NULL), 则该文件的存取时间和更改时间全部会设为目前时间.。执行成功则返回0,失败返回-1,错误代码存于errno。

truncate

#include <unistd.h>
#include <sys/types.h>

int truncate(const char *path, off_t length);
int ftruncate(int fd, off_t length);

函数说明:truncate()会将参数path 指定的文件大小改为参数length 指定的大小. 如果原来的文件大小比参数length 大, 则超过的部分会被删去.

返回值:执行成功则返回0, 失败返回-1, 错误原因存于errno.

link

#include <unistd.h>

int link(const char *oldpath, const char *newpath);

函数说明:link()以参数newpath 指定的名称来建立一个新的连接(硬连接)到参数oldpath 所指定的已存在文件. 如果参数newpath 指定的名称为一已存在的文件则不会建立连接.

返回值:成功则返回0, 失败返回-1, 错误原因存于errno.

注:

创建一个硬链接
当rm删除文件时,只是删除了目录下的记录项和把inode硬链接计数减1,当硬链接计数减为0时,才会真正的删除文件。
链接通常要求位于同一文件系统中,POSIX允许夸文件系统
符号链接没有文件系统限制
通常不允许创建目录的硬链接,某些unix系统下超级用户可以创建目录的硬链
创建目录项以及增加硬链接计数应当是一个原子操作
symlink

link()所建立的硬连接无法跨越不同文件系统, 如果需要则改用symlink()

#include <unistd.h>

int symlink(const char * oldpath, const char * newpath);

函数说明:symlink()以参数newpath 指定的名称来建立一个新的连接(符号连接)到参数oldpath 所指定的已存在文件. 参数oldpath 指定的文件不一定要存在, 如果参数newpath 指定的名称为一已存在的文件则不会建立连接.

返回值:成功则返回0, 失败返回-1, 错误原因存于errno.

readlink

#include <unistd.h>

int readlink(const char * path, char * buf, size_t bufsiz);

函数说明:读符号链接所指向的文件名字,不读文件内容,readlink()会将参数path 的符号连接内容存到参数buf 所指的内存空间, 返回的内容不是以NULL作字符串结尾, 但会将字符串的字符数返回. 若参数bufsiz 小于符号连接的内容长度, 过长的内容会被截断.

返回值:执行成功则传符号连接所指的文件路径字符串, 失败则返回-1, 错误代码存于errno

unlink

#include <unistd.h>

int unlink(const char * pathname);

函数说明:unlink()会删除参数pathname 指定的文件。

如果是符号链接,删除符号链接
如果是硬链接,硬链接数减1,当减为0时,释放数据块和inode
如果文件硬链接数为0,但有进程已打开该文件,并持有文件描述符,则等该进程关闭该文件时,kernel才真正去删除该文件
利用该特性创建临时文件,先open或creat创建一个文件,马上unlink此文件
rename

#include <stdio.h>
int rename(const char *oldpath, const char *newpath);

函数说明:重命名文件、改变文件路径或更改目录名称

参数:oldname为旧文件名,newname为新文件名。

返回值:修改文件名成功则返回0,否则返回-1。

重命名文件:

如果newname指定的文件存在,则会被删除。
如果newname与oldname不在一个目录下,则相当于移动文件。
重命名目录:

如果oldname和oldname都为目录,则重命名目录。
如果newname指定的目录存在且为空目录,则先将newname删除。
对于newname和oldname两个目录,调用进程必须有写权限。
重命名目录时,newname不能包含oldname作为其路径前缀。例如,不能将/usr更名为/usr/foo/testdir,因为老名字( /usr/foo)是新名字的路径前缀,因而不能将其删除。
getcwd

#include <unistd.h>

char * getcwd(char * buf, size_t size);

函数说明:getcwd()会将当前的工作目录绝对路径复制到参数buf 所指的内存空间,参数size 为buf 的空间大小。

在调用此函数时,buf 所指的内存空间要足够大。若工作目录绝对路径的字符串长度超过参数size 大小,则返回NULL,errno 的值则为ERANGE。
倘若参数buf 为NULL,getcwd()会依参数size 的大小自动配置内存(使用malloc()),如果参数size 也为0,则getcwd()会依工作目录绝对路径的字符串程度来决定所配置的内存大小,进程可以在使用完次字符串后利用free()来释放此空间。

文件操作 之 各类函数