要求输入目录的路径后,能够打印出指定路径下所有文件的详细信息,类似ls -l

这个博客展示了如何使用C语言实现一个程序,该程序能够打印指定目录下非隐藏文件的基本信息,包括文件类型、权限、所有者、组、大小和修改时间。程序利用了`<sys/types.h>`、`<sys/stat.h>`等头文件提供的系统调用,如`stat`、`getpwuid`和`getgrgid`。

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

头文件 std2.h

#ifndef __STD2_H__
#define __STD2_H__
#include <stdio.h>                                                                           
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <strings.h>
#include <string.h>
#include <pwd.h>
#include <grp.h>
#include <time.h>
char * permisson(mode_t m ,char prr[],int j );
char type(mode_t m);
char *uid(uid_t uid,char *brr);
char *gid(gid_t gid,char *crr);
struct tm * nowtime(time_t time);
int  stdprint(char * name);

#endif

打印改目录下单个文件信息的函数

#include "std2.h"


//文件权限
char * permisson(mode_t m ,char prr[],int j )
{
     int i=0;
	 char arr[4]="rwx";
//	 bzero(prr,j);
	for(i=0;i<9;i++)
	{
       if((m&(0400>>i)) == 0 )
	   {
		   prr[i]='-'; 
		   continue;
	   }
	  prr[i]=arr[i%3]; 
	 		  
	}
	return prr;
}
//文件类型

char type(mode_t m)
{
        switch(m&S_IFMT)
		{
		case S_IFSOCK:
			return('s');
		case S_IFLNK:
			return('l');
		case S_IFREG:
			return('-');
		case S_IFBLK:
			return('b');
		case S_IFDIR:
			return('d');
		case S_IFCHR:
			return('c');
		case S_IFIFO:
			return('p');
		}
}
//Uid
char *uid(uid_t uid,char *brr)
{
struct passwd *uname=getpwuid(uid);
    if(uname==NULL)
   { 
     perror("getpwuid");
	 return NULL;
   }
	strcpy(brr,uname->pw_name);
	return brr;
}
//gid
char *gid(gid_t gid,char *crr)
{
struct group *gname=getgrgid(gid);
    if(gname==NULL)
   { 
     perror("getgrgid");
	 return NULL;
   }
	strcpy(crr,gname->gr_name);
	return crr;
}
//时间
struct tm * nowtime(time_t time)
{
	struct tm *p;
  p=localtime(&time);	
  return p;
}


int  stdprint(char * name)
{
	struct stat buf;
   	if(stat(name,&buf)<0)
	{
		perror("stat");
		return -1;
	}
	char prr[10]="";
	char brr[10]="";
	char crr[10]="";
 permisson(buf.st_mode,prr,10);
 printf("%c",type(buf.st_mode));
 printf("%s",prr);
 printf(" %ld",buf.st_nlink);
 printf(" %4ld",buf.st_size);
 uid(buf.st_uid,brr);
 printf(" %s",brr);
 uid(buf.st_gid,crr);
 printf(" %s",crr);
 struct tm* pa;
 pa =nowtime((time_t)buf.st_ctime);
 printf(" %d %d %d:%d",pa->tm_mon+1,pa->tm_mday,pa->tm_hour,pa->tm_min);
 printf(" %s\n",name);
   return 0;
}

主函数

#include <stdio.h>
#include <dirent.h>
#include <errno.h>
#include "std2.h"
#include <string.h>
int main(int argc, const char *argv[])
{
    if(argc<2)
	{
		printf("请输入目录名");
		return -1;
	}
	DIR * dr=opendir(argv[1]);
	char brr[100]="";
	if(dr==NULL)
	{
		perror("opendir");
	}
    struct dirent *p=NULL;
	while(1)
	{
	p=readdir(dr);    
	if(p==NULL)
	{
		if(errno==0)
		{
			printf("读取完毕");
			return 0;
		}
		else
		{
		perror("reddir");
          return -1;
		}
	}
 
	if(p->d_name[0]!='.')
	{
	 strcpy(brr,argv[1]);
	 strcat(brr,p->d_name);
	stdprint(brr);
	}
	}
	closedir(dr);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值