linux c 编程实战:文件操作总结(三)

来源:互联网 发布:修改网络游戏数据 编辑:程序博客网 时间:2024/05/19 12:13

1.文件属性操作

每个用户有一个对应的uid,当uid为0的时候,此用户具有root权限

2.获取文件属性

  • stat,fstat,lstat获取文件属性
#include<stat.h>#include<sys/types.h>#include<unistd.h>int stat(const char * filename, struct stat * buf)int fstat(int fd, struct stat * buf)int lstat(const char * filename, struct stat * buf)//函数执行成功返回0,失败返回-1

参数const char * filename是要获取的文件名,stat保获到的文件的信息,fstat是文件描述符来获取指定的文件名的,lstat是获取符号链接类文件的状态信息,它不像stat那样是获取的链接文件所指向的文件的信息,而是获得链接文件本身的状态信息。

struct stat{    st_dev: 文件的设备编号     st_ino: 文件的i-node    st_mode: 文件的类型和存取权限    st_nlink: 连到该文件的硬链接数目     st_uid: 文件所有者的用户id    st_gid: 文件所有组的组id    st_size: 文件的大小,对于符号链接是连接到的文件名的长度(字节为单位)    st_blksize: 文件的I/O缓冲区大小    st_blcoks: 占用文件区块的个数    st_atime: 文件最近一次被访问的时间    st_mtime: 文件最近一次被修改的时间 //内容被修改    st_ctime: 文件最近一次被更改的时间 //存取权限,文件属性被更该}//如果一个目录被设置了粘住位,则此目录下的文件只能有文件所有者,目录所有者,root用户进行删除或改名

st_mode包含的文件类型信息,定义了一系列标准的宏:
S_ISLNK:是否为符号链接

S_ISREG:是否为一般文件

S_ISDIR:是否为目录

S_ISCHR:是否为字符设备文件

S_ISBLK:是否为块设备文件

S_ISFIFO:是否为FIFO(先进先出)

S_ISSOCK:是否为socket

3.设置文件属性

  • chmod/fchmod函数用来修改文件的存取权限(见文件总结一)
  • chown/fchown/lchown函数用于修改文件的用户id和组id
#include<sys/types.h>#include<unistd.h>int chown(const char * path, owner, group)int fchown(int fd, owner, group)int lchown(const char * path, owner, group)//函数执行成功返回0,失败返回-1//文件的所有者只能改变文件的组id为其所属组中的一个,超级用户才能修改文件的所有者id,超级用户可以更改任意用户组id,如果owner,group为-1,那么文件的用户id和组id不会改变
  • truncate/ftruncate 函数用来改变文件的大小
#include<unistd.h>#include<sys/types.h>int truncate(const char * path, int size)int ftruncate(int fd, int size)//如果原来文件的大小比参数大,那么超过的部分会被删除,如比参数小,那么文件会被扩展。文件的串st_ctime,st_mtime将会被更新
  • utime函数可以改变任何文件的st_mtime,st_ctime域
#include<sys/types.h>#include<utime.h>int utime(const char * filename, struct utimebuf *buf)#include<sys/time.h>int utimes(char * filename, struct timeval *tvp)//函数调用成功返回0,失败返回-1//这个函数的详细用法情大家自行百度,不再赘述
  • umask用来设置文件创建时的屏蔽字
#include<sys/stat.h>#include<sys/types.h>int umask(int mask)//当进程创建一个新文件的时候,这个文件的存取权限其实是mode和~umask与运算以后得到的结果//umask的作用就是修改进程的umask
  • rename 函数用来进行文件的移动或文件的改名
#include<stdio.h>int rename(const char * oldpath, const char * newpath)//函数调用成功返回0,失败返回-1。//若newpath所指定的文件已经存在,那么这个文件会被删除
  • unlink和remove被用来进行文件的删除
#include<unistd.h>int unlink(const char * pathname)int remove(const char * pathname)//函数执行成功返回0,失败返回-1//如果文件正在被进程使用,暂时不删除这个文件,等进程使用完后在进行删除,若文件名是一个符号链接,则只删除这个链接,若文件名为FIFO(命名管道),socket(套接字)则该名字被删除,但已经打开这些文件的进程仍能使用这些文件
0 0