Day 6.文件属性和权限的获取

时间获取

1.time

time_t time(time_t *tloc);

功能:

返回1907-1-1到现在的秒数(格林威治时间)

参数:

tloc:存放秒数空间的首地址

返回值:

成功返回秒数

失败返回-1

2.localtime

struct tm *localtime(const time_t *timep);

功能:

将秒数转换为本地时间

参数:

time:存放秒数空间的首地址

返回值:

成功返回结构体时间

失败返回NULL

 struct tm {
               int tm_sec;      /* Seconds (0-60) */
               int tm_min;      /* Minutes (0-59) */
               int tm_hour;     /* Hours (0-23) */
               int tm_mday;     /* Day of the month (1-31) */
               int tm_mon;      /* Month (0-11) */
               int tm_year;     /* Year - 1900 */
               int tm_wday;     /* Day of the week (0-6, Sunday = 0) */
               int tm_yday;     /* Day in the year (0-365, 1 Jan = 0) */
               int tm_isdst;    /* Daylight saving time */
           };

3.mktime

time_t mktime(struct tm *tm);

功能:

将本地时间转换为秒数

例如:

#include "head.h"

int main(void)
{
	time_t t = 0;
	time_t t1 = 0;
	struct tm *pm = NULL;
	struct tm stm;

	stm.tm_year = 2024-1900;
	stm.tm_mon = 2-1;
	stm.tm_mday = 20;
	stm.tm_hour = 11;
	stm.tm_min = 58;
	stm.tm_sec = 40;

	t = mktime(&stm);
	printf("t=%ld\n",t);

	time(&t1);
	pm = localtime(&t1);
	printf("%04d-%02d-%02d  %02d:%02d:%02d\n",pm->tm_year+1900,pm->tm_mon+1,pm->tm_mday,pm->tm_hour,pm->tm_min,pm->tm_sec);
    printf("t1=%ld\n",t1);
	return 0;
}

文件属性和权限的获取

1.stat

int stat(const char *pathname, struct stat *statbuf);
int lstat(const char *pathname, struct stat *statbuf);

功能:

将pathname对应的文件信息放入到statbuf中

参数:

pathname:文件路径字符串的首地址

statbuf:存放文件的信息空间的首地址

返回值:

成功返回0

失败返回-1

 struct stat {
               dev_t     st_dev;           /* ID of device containing file */
               ino_t     st_ino;           /* Inode number */
               mode_t    st_mode;          /* File type and mode */
               nlink_t   st_nlink;         /* Number of hard links */
               uid_t     st_uid;           /* User ID of owner */
               gid_t     st_gid;           /* Group ID of owner */
               dev_t     st_rdev;          /* Device ID (if special file) */
               off_t     st_size;          /* Total size, in bytes */
               blksize_t st_blksize;       /* Block size for filesystem I/O */
               blkcnt_t  st_blocks;        /* Number of 512B blocks allocated */

               /* Since Linux 2.6, the kernel supports nanosecond
                  precision for the following timestamp fields.
                  For the details before Linux 2.6, see NOTES. */

               struct timespec st_atim;    /* Time of last access */
               struct timespec st_mtim;    /* Time of last modification */
               struct timespec st_ctim;    /* Time of last status change */

           #define st_atime st_atim.tv_sec        /* Backward compatibility */
           #define st_mtime st_mtim.tv_sec
           #define st_ctime st_ctim.tv_sec
           };

文件类型:形式1

形式2

文件的执行权限:

/etc/passwd   口令文件

 /etc/group    组信息文件

1)打印文件类型

#include "head.h"

int main(int argc,const char *argv[])
{
	struct stat buf;
	int ret = 0;
	
	if (argc != 2)
	{
		fprintf(stderr,"User:./a.out filename!\n");
		return -1;
	}

	ret = stat(argv[1],&buf);
	if (ret == -1)
	{
		perror("fial to stat");
		return -1;
	}

	switch(buf.st_mode & S_IFMT)
	{
	case S_IFDIR:
		putchar('d');
		break;
	case S_IFREG:
		putchar('-');
		break;
	case S_IFLNK:
		putchar('l');
		break;
	case S_IFBLK:
		putchar('b');
		break;
	case S_IFSOCK:
		putchar('s');
		break;
	case S_IFCHR:
		putchar('c');
		break;
	case S_IFIFO:
		putchar('p');
		break;
	}
#if 0
	if (S_ISREG(buf.st_mode))
	{
		putchar('-');
	}
	else if (S_ISDIR(buf.st_mode))
	{
		putchar('d');	
	}
	else if (S_ISCHR(buf.st_mode))
	{
		putchar('c');
	}
	else if (S_ISBLK(buf.st_mode))
	{
		putchar('b');
	}
	else if (S_ISLNK(buf.st_mode))
	{
		putchar('l');
	}
	else if (S_ISSOCK(buf.st_mode))
	{
		putchar('s');
	}
	else if (S_ISFIFO(buf.st_mode))
	{
		putchar('p');
	}
#endif

    putchar('\n');
    return 0;
}

2).文件权限打印

#include "head.h"

int main(int argc,const char *argv[])
{
	struct stat buf;
	int ret = 0;
	
	if (argc != 2)
	{
		fprintf(stderr,"User:./a.out filename!\n");
		return -1;
	}

	ret = stat(argv[1],&buf);
	if (ret == -1)
	{
		perror("fial to stat");
		return -1;
	}

	switch(buf.st_mode & S_IFMT)
	{
	case S_IFDIR:
		putchar('d');
		break;
	case S_IFREG:
		putchar('-');
		break;
	case S_IFLNK:
		putchar('l');
		break;
	case S_IFBLK:
		putchar('b');
		break;
	case S_IFSOCK:
		putchar('s');
		break;
	case S_IFCHR:
		putchar('c');
		break;
	case S_IFIFO:
		putchar('p');
		break;
	}
#if 0
	if (S_ISREG(buf.st_mode))
	{
		putchar('-');
	}
	else if (S_ISDIR(buf.st_mode))
	{
		putchar('d');	
	}
	else if (S_ISCHR(buf.st_mode))
	{
		putchar('c');
	}
	else if (S_ISBLK(buf.st_mode))
	{
		putchar('b');
	}
	else if (S_ISLNK(buf.st_mode))
	{
		putchar('l');
	}
	else if (S_ISSOCK(buf.st_mode))
	{
		putchar('s');
	}
	else if (S_ISFIFO(buf.st_mode))
	{
		putchar('p');
	}
#endif
	
    buf.st_mode & S_IRUSR ? putchar('r'):putchar('-');
	buf.st_mode & S_IWUSR ? putchar('w'):putchar('-');
	buf.st_mode & S_IXUSR ? putchar('x'):putchar('-');

	buf.st_mode & S_IRGRP ? putchar('r'):putchar('-');
	buf.st_mode & S_IWGRP ? putchar('w'):putchar('-');
	buf.st_mode & S_IXGRP ? putchar('x'):putchar('-');

	buf.st_mode & S_IROTH ? putchar('r'):putchar('-');
	buf.st_mode & S_IWOTH ? putchar('w'):putchar('-');
	buf.st_mode & S_IXOTH ? putchar('x'):putchar('-');

    putchar('\n');
    return 0;
}

3).打印硬链接的个数:

	printf(" %ld ",buf.st_nlink);

2.getpwuid

struct passwd *getpwuid(uid_t uid);

功能:

通过UID获得对应的用户信息

参数:

uid:用户的ID号

返回值:

成功返回包含用户信息的结构体

失败返回NULL

struct passwd {
               char   *pw_name;       /* username */
               char   *pw_passwd;     /* user password */
               uid_t   pw_uid;        /* user ID */
               gid_t   pw_gid;        /* group ID */
               char   *pw_gecos;      /* user information */
               char   *pw_dir;        /* home directory */
               char   *pw_shell;      /* shell program */
           };

3.getgrgid

struct group *getgrgid(gid_t gid);

功能

通过数组ID获得组信息

参数:

gid:组的ID号

返回值:

成功返回包含组信息的结构体

失败返回NULL

struct group {
               char   *gr_name;        /* group name */
               char   *gr_passwd;      /* group password */
               gid_t   gr_gid;         /* group ID */
               char  **gr_mem;         /* NULL-terminated array of pointers
                                          to names of group members */
           };

4).打印文件的用户名和组名以及文件的字节大小

    struct stat buf;
    
    struct passwd *pwd = NULL;
	struct group *gup = NULL;
   
    pwd = getpwuid(buf.st_uid);
	if (pwd == NULL)
	{
		printf("%d ",buf.st_uid);
	}else
	{
		printf("%s ",pwd->pw_name);
	}

	gup = getgrgid(buf.st_gid);
	if (gup == NULL)
	{
		printf("%d ",buf.st_gid);
	}else
	{
		printf("%s ",gup->gr_name);
	}

	printf("%ld ",buf.st_size);

5).打印文件更改日期个时间

	struct tm *ptm = NULL;
	char *mon[12] = {"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};


    ptm = localtime(&buf.st_mtime);
	printf("%s %d %d:%d ",mon[ptm->tm_mon],ptm->tm_mday,ptm->tm_hour,ptm->tm_min);

4.readlink

ssize_t readlink(const char *pathname, char *buf, size_t bufsiz);

功能:

读取链接文件本身的内容

参数:

pathname:链接文件的路径

buf:存放数据空间的首地址

bufsiz:最大存放数据字节数

返回值:

成功返回读到的字节个数

失败返回-1

#include "head.h"

int main(int argc, const char *argv[])
{
	struct stat buf;
	int ret = 0;
	struct passwd *pwd = NULL;
	struct group *grp = NULL;
	struct tm *ptm = NULL;
	char *mon[12] = {"1月","2月","3月","4月","5月","6月","7月","8月","9月","10月","11月","12月"};
	char tmpbuff[1024] = {0};

	if (argc != 2)
	{
		fprintf(stderr, "Usage:./a.out filename\n");
		return -1;
	}

	ret = lstat(argv[1], &buf);
	if (-1 == ret)
	{
		perror("fail to stat");
		return -1;
	}

#if 0
	switch (buf.st_mode & S_IFMT)
	{
		case S_IFDIR:putchar('d');break;
		case S_IFREG:putchar('-');break;
		case S_IFSOCK:putchar('s');break;
		case S_IFLNK:putchar('l');break;
		case S_IFBLK:putchar('b');break;
		case S_IFCHR:putchar('c');break;
		case S_IFIFO:putchar('p');break;
	}
#endif

	if (S_ISREG(buf.st_mode))
	{
		putchar('-');
	}
	else if (S_ISDIR(buf.st_mode))
	{
		putchar('d');	
	}
	else if (S_ISCHR(buf.st_mode))
	{
		putchar('c');
	}
	else if (S_ISBLK(buf.st_mode))
	{
		putchar('b');
	}
	else if (S_ISLNK(buf.st_mode))
	{
		putchar('l');
	}
	else if (S_ISSOCK(buf.st_mode))
	{
		putchar('s');
	}
	else if (S_ISFIFO(buf.st_mode))
	{
		putchar('p');
	}
	
	buf.st_mode & S_IRUSR ? putchar('r') : putchar('-');
	buf.st_mode & S_IWUSR ? putchar('w') : putchar('-');
	buf.st_mode & S_IXUSR ? putchar('x') : putchar('-');

	buf.st_mode & S_IRGRP ? putchar('r') : putchar('-');
	buf.st_mode & S_IWGRP ? putchar('w') : putchar('-');
	buf.st_mode & S_IXGRP ? putchar('x') : putchar('-');

	buf.st_mode & S_IROTH ? putchar('r') : putchar('-');
	buf.st_mode & S_IWOTH ? putchar('w') : putchar('-');
	buf.st_mode & S_IXOTH ? putchar('x') : putchar('-');

	printf(" %ld", buf.st_nlink);
	
	pwd = getpwuid(buf.st_uid);
	if (NULL == pwd)
	{
		printf(" %d", buf.st_uid);
	}
	else 
	{
		printf(" %s", pwd->pw_name);
	}
	
	grp = getgrgid(buf.st_gid);
	if (NULL == grp)
	{
		printf(" %d", buf.st_gid);
	}
	else 
	{
		printf(" %s", grp->gr_name);
	}
	
	printf(" %ld", buf.st_size);
	
	ptm = localtime(&buf.st_mtime);
	printf(" %s %d %d:%d", mon[ptm->tm_mon], ptm->tm_mday, ptm->tm_hour, ptm->tm_min);
	
	printf(" %s", argv[1]);

	if (S_ISLNK(buf.st_mode))
	{
		readlink(argv[1], tmpbuff, sizeof(tmpbuff));
		printf(" -> %s", tmpbuff);
	}

	putchar('\n');

	return 0;
}

软链接和硬链接

1.软链接(符号链接)

通过文件名链接,所有能够看到的链接文件均为软链接

过程:

软链接文件名——>inod——>数据块——>链接项的文件名——>inode——>数据块

ln -s 源文件 链接文件

如:ln -s file.txt  a.txt

2.硬链接

通过文件对应的inode节点链接

过程:

文件——>inode——>数据块

ln 源文件 链接文件

如:ln file.txt  b.txt 

  • 39
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我爱敲代码yx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值