文件与I/O
文件属性
stat
功能:
通过文件名 filename 获取文件元信息,并保存在 buf 所指的结构体 stat 中
原型:
int stat(const char *path, struct stat *buf);
参数:
path:文件的路径名
buf:struct stat*
返回值:
成功 : 0
失败 : -1
fstat
功能:
通过文件名 filename 获取文件元信息,并保存在 buf 所指的结构体
原型:
int fstat(int fd, struct stat *buf);
参数:
path:文件描述符
buf:struct stat*
返回值:
成功 : 0
失败 : -1
lstat
功能:
通过文件名 filename 获取文件元信息,并保存在 buf 所指的结构体
原型:
int lstat(const char *path, struct stat *buf);
参数:
path:文件的路径名
buf:struct stat*
返回值:
成功 : 0
失败 : -1
注意:
当文件是一个符号链接时,lstat 返回的是该符号链接本身的信息;而stat 返回的是该链接指向的文件的信息。
stat结构体
struct stat {
dev_t st_dev; //文件的设备编号
ino_t st_ino; //节点
mode_t st_mode; //文件的类型和存取的权限
nlink_t st_nlink; //连到该文件的硬连接数目,刚建立的文件值为1
uid_t st_uid; //用户ID
gid_t st_gid; //组ID
dev_t st_rdev; //(设备类型)若此文件为设备文件,则为其设备编号
off_t st_size; //文件字节数(文件大小)
unsigned long st_blksize; //块大小(文件系统的I/O 缓冲区大小)
unsigned long st_blocks; //块数
time_t st_atime; //最后一次访问时间
time_t st_mtime; //最后一次修改时间
time_t st_ctime; //最后一次改变时间(指属性)
};
示例
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <pwd.h>
#include <time.h>
#define ERR_EXIT(m) \
do \
{ \
perror(m); \
exit(EXIT_FAILURE); \
}while(0)
#define MAJOR(a) (int)((unsigned short)a >> 8)
#define MINOR(a) (int)((unsigned short)a & 0xFF)
int filetype(struct stat* buf)
{
int flag = 0;
printf("File Type :");
switch (buf->st_mode & S_IFMT)
{
case S_IFSOCK:
printf("socket\n");
break;
case S_IFLNK:
printf("symbolic link\n");
break;
case S_IFREG:
printf("regular file\n");
break;
case S_IFBLK:
printf("block device\n");
flag = 1;
break;
case S_IFDIR:
printf("directory\n");
break;
case S_IFCHR:
printf("character device\n");
flag = 1;
break;
case S_IFIFO:
printf("FIFO\n");
break;
default:
printf("unkonwn\n");
break;
}
return flag;
}
void fileperm(struct stat *buf, char *p)
{
strcpy(p,"----------");
p[0] = '?';
switch (buf->st_mode & S_IFMT)
{
case S_IFSOCK:
p[0] = 's';
break;
case S_IFLNK:
p[0] = 'l';
break;
case S_IFREG:
p[0] = '-';
break;
case S_IFBLK:
p[0] = 'b';
break;
case S_IFDIR:
p[0] = 'd';
break;
case S_IFCHR:
p[0] = 'c';
break;
case S_IFIFO:
p[0] = 'p';
break;
}
if(buf->st_mode & S_IRUSR)
p[1] = 'r';
if(buf->st_mode & S_IWUSR)
p[2] = 'w';
if(buf->st_mode & S_IXUSR)
p[3] = 'x';
if(buf->st_mode & S_IRGRP)
p[4] = 'r';
if(buf->st_mode & S_IWGRP)
p[5] = 'w';
if(buf->st_mode & S_IXGRP)
p[6] = 'x';
if(buf->st_mode & S_IROTH)
p[7] = 'r';
if(buf->st_mode & S_IWOTH)
p[8] = 'w';
if(buf->st_mode & S_IXOTH)
p[9] = 'x';
p[10] = '\0';
}
int main(int argc, char* argv[])
{
printf("MAJOR : %d\n",MAJOR(65280));
printf("MINOR : %d\n",MINOR(65280));
struct stat sbuf;
if(argc != 2)
{
fprintf(stderr, "Usage %s file\n",argv[0]);
exit(EXIT_FAILURE);
}
printf("filename : %s\n",argv[1]);
if(stat(argv[1], &sbuf) == -1)
ERR_EXIT("stat error");
//
//df 文件名
printf("MAJOR : %d MINOR : %d\n",MAJOR(sbuf.st_dev),MINOR(sbuf.st_dev));
printf("inode number : %lu\n",sbuf.st_ino);
printf("protection : %u\n",sbuf.st_mode);
printf("number of hard links : %lu\n",sbuf.st_nlink);
printf("user ID of owner : %u\n",sbuf.st_uid);
printf("group ID of owner : %u\n",sbuf.st_gid);
printf("device ID of owner : %lu\n",sbuf.st_rdev);
printf("total size : %lu\n",sbuf.st_size);
printf("blocksize for filesystem I/O : %lu\n",sbuf.st_blksize);
printf("number of 512B blocks allocated : %lu\n",sbuf.st_blocks);
printf("time of last access : %lu\n",sbuf.st_atime);
printf("time of last modification : %lu\n",sbuf.st_mtime);
printf("time of last status change : %lu\n",sbuf.st_ctime);
if(filetype(&sbuf))
{
printf("MAJOR : %d MINOR : %d\n",MAJOR(sbuf.st_dev),MINOR(sbuf.st_dev));
}
printf("File permission bits : %o\n",sbuf.st_mode & 0777);
struct passwd *pw,*pw1;
char perm[11] = {0};
char pszTime[40] = {0};
struct tm *tmTime;
tmTime = localtime(&sbuf.st_mtime);
strftime(pszTime,sizeof(pszTime),"%m月 %d %H:%M",tmTime);
//sprintf(pszTime,"%d月 %d %d %d",(*tmTime).tm_mon+1, (*tmTime).tm_mday, (*tmTime).tm_hour, (*tmTime).tm_min);
fileperm(&sbuf,perm);
pw = getpwuid(sbuf.st_uid);
pw1 = getpwuid(sbuf.st_gid);
printf("File permission : \n%s %lu %s %s %lu %s %s\n",perm, sbuf.st_nlink, pw->pw_name, pw1->pw_name, sbuf.st_size, pszTime, argv[1]);
return 0;
}
文件属主
chown
功能说明:
用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:
int chown(const char *path, uid_t owner, gid_t group);
参数:
path : 文件的路径名
owner : 所有者识别号
group : 用户组识别号
返回值:
成功 : 0
失败 : -1
lchown
功能说明:
用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:
int lchown(const char *path, uid_t owner, gid_t group);
参数:
path : 文件的路径名
owner : 所有者识别号
group : 用户组识别号
返回值:
成功 : 0
失败 : -1
注意:
lchown 与 chown 类似,但是 lchown 改变的是链接文件本身的权限,与链接所值的文件无关
fchown
功能说明:
用来改变文件所有者的识别号(owner id)或者它的用户组识别号(group ID)
原型:
int fchown(int fd, uid_t owner, gid_t group);
参数:
fd : 文件描述符
owner : 所有者识别号
group :用户组识别号
返回值:
成功 : 0
失败 : -1
文件权限
chmod 和 fchmod
功能:
用来改变给定路径名 pathname 的文件的权限位
原型:
int chmod(const char *path, mode_t mode);
参数:
pathname : 文件的路径名
mode : 权限位
返回值:
成功 : 0
失败 : -1
功能:
用来改变给定路径名 pathname 的文件的权限位
原型:
int fchmod(int fd, mode_t mode);
参数:
fd : 文件描述符
mode : 权限位
返回值:
成功 : 0
失败 : -1