Linux 下C语言文件-目录基本操作

2 篇文章 0 订阅
仅提供大概参考~ 纯手写未调试
/**
*编写一个程序,提供一个参数(文件名/路径)
*如果该参数对应文件名/目录名不存在,则创建之
*设置创建者拥有RWX权限,其他用户只有R-X权限
*如果对应文件存在
*读取并显示该文件的属性/状态信息
*创建该该文件的一个拷贝
*如果对应目录名存在
*显示该目录及其子目录结构
**/

#include <unistd.h>
#include <fcntl.h>
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <errno.h>
#include <string.h>

void displayproperty(char *pathname){
		char buf_time[32]; //存放时间
		struct passwd *psd; //从该结构体中获取文件所有者的用户名
		struct group *grp; //从该结构体中获取文件所有者所属组的组名
		struct stat buf;
		lstat(pathname, &buf);
		/*
		**获取并打印文件类型
		*/
		//st_mode:文件内容和存取权限
		if (S_ISLNK(buf.st_mode)) //判断是否为符号链接
		{
			printf("l: 符号链接\n");
		}
		else if (S_ISREG(buf.st_mode)) //判断是否为文件
		{
			printf("-: 文件\n");
		}
		else if (S_ISDIR(buf.st_mode)) //判断是否为目录
		{
			printf("d: 目录\n");
		}
		else if (S_ISCHR(buf.st_mode)) //判断是否为字符设备文件
		{
			printf("c: 字符设备文件\n");
		}
		else if (S_ISBLK(buf.st_mode)) //判断是否为块设备文件
		{
			printf("b: 块设备文件\n");
		}
		else if (S_ISSOCK(buf.st_mode)) //判断是否为socket
		{
			printf("s: socket\n");
		}
		/*
		**获取并打印文件所有者的权限
		*/
		printf("所有者用户权限: \n");
		if (buf.st_mode & S_IRUSR)
		{
			printf("r");
		}
		else
		{
			printf("-");
		}
		if (buf.st_mode & S_IWUSR)
		{
			printf("w");
		}
		else
		{
			printf("-");
		}
		if (buf.st_mode & S_IXUSR)
		{
			printf("x");
		}
		else
		{
			printf("-");
		}
		/*
		**获取并打印与文件所有者同组的用户对该文件的操作权限
		*/
		printf("组权限:\n");
		if (buf.st_mode & S_IRGRP)
		{
			printf("r");
		}
		else
		{
			printf("-");
		}
		if (buf.st_mode & S_IWGRP)
		{
			printf("w");
		}
		else
		{
			printf("-");
		}
		if (buf.st_mode & S_IXGRP)
		{
			printf("x");
		}
		else
		{
			printf("-");
		}
		/*
		**获取并打印其它用户的对该文件的操作权限
		*/
		printf("其他用户权限:\n");
		if (buf.st_mode & S_IROTH)
		{
			printf("r");
		}
		else
		{
			printf("-");
		}
		if (buf.st_mode & S_IWOTH)
		{
			printf("w");
		}
		else
		{
			printf("-");
		}
		if (buf.st_mode & S_IXOTH)
		{
			printf("x");
		}
		else
		{
			printf("-");
		}
		printf(" ");
		/*
		**根据uid与gid获取文件所有者的用户名与组名
		*/
		psd = getpwuid(buf.st_uid);
		grp = getgrgid(buf.st_gid);
		printf("%4d ",buf.st_nlink); //打印文件的链接数(该文件硬链接数目)
		printf("%-9s", psd->pw_name); //
		//打印文件拥有者
		printf("%-8s", grp->gr_name); //打印文件所属用户组
		printf("%6d",(int)buf.st_size); //打印文件的大小
		strcpy(buf_time, ctime(&buf.st_mtime));
		buf_time[strlen(buf_time) - 1] = '\0'; //去掉换行符
		printf(" %s", buf_time); //打印文件的时间信息
}




//无用函数
static int get_file_size_time(const char *filename) 
  { 
    struct stat statbuf; 
    if(stat(filename,&statbuf)==-1) 
    {
      printf("Get stat on %s Error:%s\n", 
        filename,strerror(errno)); 
      return(-1); 
    } 
    if(S_ISDIR(statbuf.st_mode))return(1); 
    if(S_ISREG(statbuf.st_mode))
      printf("%s size:%ld bytes\tmodified at %s", 
        filename,statbuf.st_size,ctime(&statbuf.st_mtime)); 
    return(0); 
  } 


int copyFile(char *filename){
	char c;
	int from_fd,to_fd; 
	
	from_fd=open(filename,O_RDONLY));
	to_fd=open(strcat(filename,".bak"),O_WRONLY|O_CREAT,S_IRUSR|S_IWUSR));
	while(bytes_read=read(from_fd,&c,1)) 
	{ 
	  write(to_fd,&c,1);
	} 
	
	close(from_fd); 
	close(to_fd); 
}

void printdir(char *dir){
	DIR *dp;
	struct dirent *entry;
	struct stat statbuf;
	if (dp = opendir(dir) == NULL){
		fprintf(stderr,"cannot open directory: %s\n",dir);
		return;
	}
	
	chdir(dir);
	while((entry = readdir(dp)) != NULL){
		lstat(entry->d_name, &statbuf);
		if (S_ISDIR(statbuf.st_mode)){
			if (strcmp(".",entry->d_name) == 0) || (strcmp(".",entry->d_name) == 

0)
				continue;
			printf("%*s%s\n ",entry->d_name);
			printdir(entry->d_name);
		}
		else
			printf("%*s%s\n",entry->d_name);
	}
	chdir("..");
	closedir(dp);
}

//创建目录
int createDir(char *pathname){
	 if(mkdir(pathname, 0755)==-1)  
      {
        perror("mkdir   error");   
        return   -1;   
      }
}

int main(int argc,char **argv) 
{ 

	if(stat(argv[1],&statbuf)==-1) {
    createDir(argv[1]);
  } 
  if(S_ISDIR(statbuf.st_mode))
		printdir(argv[1]);
  if(S_ISREG(statbuf.st_mode)){
  	displayproperty(argv[1]);
	  copyFile(argv[1]);
	}
  exit(0); 
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值