my_ls
#include<stdio.h>
#include<dirent.h>
#include<string.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<unistd.h>
#include<pwd.h>
#include<grp.h>
#include<time.h>
/*
* $ls -la ~
* total 460
* drwxr-xr-x 31 linux linux 4096 10月 27 17:27 .
* drwxr-xr-x 3 root root 4096 9月 22 2012 ..
* -rw------- 1 linux linux 3126 10月 5 12:56 altvimrc
* -rw-rw-r-- 1 linux linux 102 10月 27 11:31 .apport-ignore.xml
* -rw------- 1 linux linux 20110 10月 27 15:47 .bash_history
* -rw-r--r-- 1 linux linux 220 9月 22 2012 .bash_logout
*/
int main(int argc, const char *argv[])
{
//打开目录流
//循环读取其中的文件名,
//将文件名使用stat()读取属性,并做相应解析
//写入到文件
DIR* dp=opendir(".");
struct dirent* Dir;
struct stat File;
while(Dir=readdir(dp)){
stat(Dir->d_name,&File);
char prot[11]={0};
//获取文件类型并解析
switch (File.st_mode&S_IFMT){
case S_IFSOCK:
strcpy(prot,"s");
break;
case S_IFLNK:
strcpy(prot,"l");
break;
case S_IFREG:
strcpy(prot,"-");
break;
case S_IFBLK:
strcpy(prot,"b");
break;
case S_IFDIR:
strcpy(prot,"d");
break;
case S_IFCHR:
strcpy(prot,"c");
break;
case S_IFIFO:
strcpy(prot,"p");
break;
}
//获取文件权限并解析
//处理属主权限
if(S_IRUSR==((File.st_mode&S_IRWXU)&S_IRUSR))
strcat(prot,"r");
else
strcat(prot,"-");
if(S_IWUSR==((File.st_mode&S_IRWXU)&S_IWUSR))
strcat(prot,"w");
else
strcat(prot,"-");
if(S_IXUSR==((File.st_mode&S_IRWXU)&S_IXUSR))
strcat(prot,"x");
else
strcat(prot,"-");
//处理属组权限
if(S_IRGRP==((File.st_mode&S_IRWXG)&S_IRGRP))
strcat(prot,"r");
else
strcat(prot,"-");
if(S_IWGRP==((File.st_mode&S_IRWXG)&S_IWGRP))
strcat(prot,"w");
else
strcat(prot,"-");
if(S_IXGRP==((File.st_mode&S_IRWXG)&S_IXGRP))
strcat(prot,"x");
else
strcat(prot,"-");
//处理其他权限
if(S_IROTH==((File.st_mode&S_IRWXO)&S_IROTH))
strcat(prot,"r");
else
strcat(prot,"-");
if(S_IWOTH==((File.st_mode&S_IRWXO)&S_IWOTH))
strcat(prot,"w");
else
strcat(prot,"-");
if(S_IXOTH==((File.st_mode&S_IRWXO)&S_IXOTH))
strcat(prot,"x");
else
strcat(prot,"-");
//获取文件硬链接数
//获取文件属主的名
struct passwd* pwd=getpwuid(File.st_uid);
//获取文件属主的组名
struct group* grp=getgrgid(File.st_gid);
//获取文件的大小
//获取文件的mtime
struct tm* myTime;
myTime=localtime(&File.st_mtime);
printf("%s %d %s %s %5ld %d月 %d %02d:%02d %s\n",
prot,
File.st_nlink,
pwd->pw_name,
grp->gr_name,
File.st_size,
myTime->tm_mon+1,
myTime->tm_mday,
myTime->tm_hour,
myTime->tm_min,
Dir->d_name
);
}
return 0;
}
my_ls的更多相关文章
- (笨方法)利用stat函数实现ls -l filename
学习了一段时间的Linux了,但是我感觉我做不出来啥子,后头选择利用系统IO函数实现命令,先从ls走起吧.先来看看ls -l filename给我们显示了什么吧 : 可以看到,一共八项:文件类型.用户 ...
- 【操作系统】C语言编写的FAT16文件系统
[操作系统]C语言编写的FAT16文件系统 这是操作系统的期末课程设计作业之一,主要功能是在物理内存中虚拟出一个1M大小的FAT16的文件系统,然后把它读入内存中,进行具体的文件操作,具体的实用性不大 ...
- python传参
写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...
- Python传入参数的几种方法
写在前面 Python唯一支持的参数传递方式是『共享传参』(call by sharing) 多数面向对象语言都采用这一模式,包括Ruby.Smalltalk和Java(Java的引用类型是这样,基本 ...
随机推荐
- Java继承的初始化
/** * Created by xfyou on 2016/11/2. * Java继承的初始化 */ public class Beetle extends Insect { int k = pr ...
- div水平居中
1.先给它外层的div定位并left:position:absolute;left:50%; 2.获取当前元素div的宽度,并除以2 3.改变它的css:margin-left:-(获取当前元素div ...
- iOS 判断数组是否为空
有人说可以用([array count]==0 )来判断是否为空,都是坑,如果array为空的话,执行count就会直接报错,程序崩溃退出. 正确判断NSArray是否为空的方法:用 (!array) ...
- datagridview的数据存取
这里主要是复习DataSet等数据或ADO.NET方面的知识.下面是一个简单的数据存储(在DataGridView上增加一行然后并存储到数据库的过程): private void button1_Cl ...
- Python正则表达式使用实例
最近做题需要使用正则表达式提取信息,正则表达式很强大,之前都是纸上谈兵,这次刚好动动手,简单实现下: 文本内容如下: var user={star: false, vip :false}; var f ...
- Microsoft Azure 的负载平衡器的Session Sticky
Microsoft Azure 的负载平衡器是一种 Layer-4负载平衡器.Microsoft Azure 负载平衡器通过针对给定输入端点上接收到的流量计算哈希函数,在一组可用的服务器(虚拟机)之间 ...
- Android Studio 更换国内源下载依赖库
我的博客:http://daycoding.com 小小程序猿 由于国内GFW的原因,经常导致android studio 莫名其妙的编译不了,多数原因是由于不能下载依赖库 Gradle支持三种不同的 ...
- sqlite3 not found问题解决方法
测试发现,有些Android手机自带sqlite3命令,有些不带.对于不带sqlite3的手机,我们可以手动将sqlite3加入系统. 执行如下命令 adb remount adb push 路径/s ...
- iOS 杂笔-22(万年一遇~一张图片对代理的理解)
iOS 杂笔-22(万年一遇~一张图片对代理的理解) 建议:本博客需要对代理有一定了解方可阅读(反正我也管不到) 图片 在图片之外设置协议(没有这东西这篇博客也就是夭折了) 下面我对图片中出现的形形色 ...
- 开发笔记之NSTable 排序
(1)第一步设置一下button IBOutlet NSButton * nameOrderBT; IBOutlet NSButton * sizeOrderBT; (2)切换设置切换相遇函数 -(I ...