UC高级编程--实现myls程序

本文通过具体实例演示了如何使用lstat、strftime及mktime等函数进行文件属性展示,包括文件类型、权限、硬链接数、用户名、组名、文件大小及修改时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

跟着达内视频,学习UC高级编程,完成程序小练习。

主要练习的函数为:

 int lstat(const char *path, struct stat *buf);

 size_t strftime(char *s, size_t max, const char *format,  const struct tm *tm);此函数, 第一次使用。

time_t mktime(struct tm *tm);//把分离的时间合成整数,写项目代码中,当时自己实现了这个函数功能。

#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <grp.h>
#include <pwd.h>	   

void show01(struct stat st)//文件属性-rwxr--r--
{	
	/*打印文件类型*/
    if (S_ISLNK(st.st_mode)) {
        printf("l");
    } else if (S_ISREG(st.st_mode)) {
        printf("-");
    } else if (S_ISDIR(st.st_mode)) {
        printf("d");
    } else if (S_ISCHR(st.st_mode)) {
        printf("c");
    } else if (S_ISBLK(st.st_mode)) {
        printf("b");
    } else if (S_ISFIFO(st.st_mode)) {
        printf("f");
    } else if (S_ISSOCK(st.st_mode)) {
        printf("s");
    }	
	/*U文件所有者的权限*/
    if (st.st_mode & S_IRUSR){
        printf("r");
    } else {
        printf("-");
    }
    if (st.st_mode & S_IWUSR){
        printf("w");
    } else {
        printf("-");
    }
    if (st.st_mode & S_IXUSR){
        printf("x");
    } else {
        printf("-");
    }
	/*G文件所有组的权限*/
    if (st.st_mode & S_IRGRP){
        printf("r");
    } else {
        printf("-");
    }
    if (st.st_mode & S_IWGRP){
        printf("w");
    } else {
        printf("-");
    }
    if (st.st_mode & S_IXGRP){
        printf("x");
    } else {
        printf("-");
    }
	/*O其它用户的权限*/
    if (st.st_mode & S_IROTH){
        printf("r");
    } else {
        printf("-");
    }
    if (st.st_mode & S_IWOTH){
        printf("w");
    } else {
        printf("-");
    }
    if (st.st_mode & S_IXOTH){
        printf("x");
    } else {
        printf("-");
    }
	printf(" ");
}

void show02(struct stat st)//硬链接数
{
	printf("%lu", st.st_nlink);
	printf(" ");
}

void show03(struct stat st)//用户名
{
	struct passwd *psd ;
	psd = getpwuid(st.st_uid);
    printf("%s", psd->pw_name);
	printf(" ");
}

void show04(struct stat st)//组名
{
	struct group *grp = getgrgid(st.st_gid);
	printf("%s", grp->gr_name);
	printf(" ");	
}

void show05(struct stat st)//文件大小
{
	printf("%lu", st.st_size);
	printf(" ");	
}

void show06(struct stat st)//文件时间
{
	char timebuf[20];
	struct tm* newtime = localtime(&st.st_mtime);
	strftime(timebuf, 20,"%B %d %H:%M",newtime);
	printf("%s", timebuf);                
	printf(" ");	
}

void show07(const char *fname)//文件名称
{
	printf("%s", fname);                
	printf(" ");
}

int main(int argc, const char *argv[])
{
	int ret = 0;
	struct stat st;
	
	if(argc<2)
	{
		printf("./a.out file\n");return ;
	}
	ret = lstat(argv[1], &st);
	if(ret<0) perror("lstat()");

	show01(st);	
	show02(st);
	show03(st);
	show04(st);
	show05(st);
	show06(st);
	show07(argv[1]);
	
	puts("");//换行
	return 0;
}

函数的接口设计的方面,不是很合理,主要是练习函数的使用。 


version : 3.1.0.0 1、修改了选择不同窗体属性窗口不更新的BUG; 2、修改了只能打开一个ucGUIBuilder的功能,现在可以同时启动多个; 3、修复了拖放非ucfrm引起软件错误的Bug; 4、添加了控件ID自动增加功能; 5、添加了控件ID检查功能,控件ID有重复时会有警告; 6、添加了用户自定义字体功能; 7、支持中英文切换(但功能不够完善); 8、支持自动检查更新; 9、修改了不能保存用户自定义ID的BUG; version : 1.0.0.0 功能很不完善; 还有好多BUG; 目前只能生成资源表; 暂时不能生成其他代码; version : 2.0.0.5 优化了控件库; 修复了一些Bug; 可以生成完整的C文件(包括 资源表,初始化代码等); 修改了部分功能; version : 2.1.0.5 优化了控件库; 修复了一些Bug; 代码生成窗口中添加了C语言语法高亮显示功能; C文件模板做了部分修改; 支持设计的窗体保存为文件,并可以打开; 对所有控件属性添加了Description(在属性窗口最下面显示); 窗体布局可以保存,可以自定义为自己喜欢的窗体布局; 修改了部分功能; version : 3.0.0.0 重写了部分内核,运行更稳定; 支持窗体设计器的复制、粘贴、剪切、删除、撤销、等基本操作; 支持多控件,对齐、公共属性修改等基本操作; 支持将.ucfrm文件与ucGUIBuilder关联功能; 支持控件自定义ID; 添加了窗体预览功能; 添加了对控件事件的支持; 添加了在线检查更新功能; 等……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值