1.ls -l 的功能
列出目錄下的所有子目錄和檔案的主屬性與權限等資料
2.linux下ls -l 后,顯示的一行,應知道其含義
-rw-r--r-- 1 root root 70 1月 8 15:56
含義分別為 :檔案的型別和訪問權限、檔案鏈接數、檔案所有者、檔案所有者所屬的組、檔案大小、檔案創建時間
3.一定要弄清楚結構其stat里面的內容,及ctime結構體等
原始碼如下:
#include<stdio.h>
int main(int argc,char **argv)
{
FILE *pSourse,*pDes;
char ch;
pSourse=fopen(argv[1],"r");
pDes=fopen(argv[2],"w");
if((pSourse==NULL)||(pDes==NULL))
{
puts("open file is error");
}
while((ch=fgetc(pSourse))!=EOF)
{
fputc(ch,pDes);
}
fclose(pDes);
fclose(pSourse);
return 0;
}
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <time.h>
#include <pwd.h>
#include <grp.h>
#include<dirent.h>
void print(char *filename)
{
struct stat st;
int ret = stat(filename, &st);
if(ret == -1)
{
perror("stat");
exit(1);
}
// 存盤檔案型別和訪問權限
char perms[11] = {0};
// 判斷檔案型別、通過掩碼技術判斷檔案的型別
switch(st.st_mode & S_IFMT)//S_IFMT 檔案型別掩碼
{
case S_IFLNK://鏈接檔案
perms[0] = 'l';
break;
case S_IFDIR://目錄檔案
perms[0] = 'd';
break;
case S_IFREG://普通檔案
perms[0] = '-';
break;
case S_IFBLK://塊檔案
perms[0] = 'b';
break;
case S_IFCHR://字符檔案
perms[0] = 'c';
break;
case S_IFSOCK://套接字檔案
perms[0] = 's';
break;
case S_IFIFO://管道檔案
perms[0] = 'p';
break;
default:
perms[0] = '?';
break;
}
// 判斷檔案的訪問權限
// 檔案所有者
perms[1] = (st.st_mode & S_IRUSR) ? 'r' : '-';
perms[2] = (st.st_mode & S_IWUSR) ? 'w' : '-';
perms[3] = (st.st_mode & S_IXUSR) ? 'x' : '-';
// 檔案所屬組
perms[4] = (st.st_mode & S_IRGRP) ? 'r' : '-';
perms[5] = (st.st_mode & S_IWGRP) ? 'w' : '-';
perms[6] = (st.st_mode & S_IXGRP) ? 'x' : '-';
// 其他人
perms[7] = (st.st_mode & S_IROTH) ? 'r' : '-';
perms[8] = (st.st_mode & S_IWOTH) ? 'w' : '-';
perms[9] = (st.st_mode & S_IXOTH) ? 'x' : '-';
// 硬鏈接計數
int linkNum = st.st_nlink;
// 檔案所有者
char* fileUser = getpwuid(st.st_uid)->pw_name;
// 檔案所屬組
char* fileGrp = getgrgid(st.st_gid)->gr_name;
// 檔案大小
int fileSize = (int)st.st_size;
// 修改時間
char *time = ctime(&st.st_ctime);
char* timec = ctime(&st.st_mtime);
char mtime[512] = {0};
char ctime[512]= {0};
strncpy(mtime, time, strlen(time)-1);
strncpy(ctime,timec,strlen(timec)-1);
char buf[1024];
sprintf(buf, "%s %2d %s %s %-d\t %s\t %s\t", perms, linkNum, fileUser, fileGrp, fileSize, mtime, filename);
printf("%s\n", buf);
}
void do_ls(char dirname[])
{
/*
* *定義一個目錄流,和目錄流結構體保存讀到的結果。
* */
DIR *dir_ptr;
struct dirent *direntp;
if((dir_ptr = opendir(dirname)) == NULL)
fprintf(stderr,"ls1:cannot open %s\n",dirname);
else
{
while((direntp = readdir(dir_ptr)) != NULL)
//列印結果
if(direntp->d_name==".")
print(direntp->d_name'/');
else
print(direntp->d_name);
// printf("%s\n",direntp->d_name);
// //關閉目錄流
closedir(dir_ptr);
//
}
}
int main(int argc, char* argv[])
{
if(argc==1)
do_ls(".");
else
{
while(--argc)
{
printf("%s:\n",*++argv);
printf("ahidsfashdf\n");
do_ls(*argv);
}
}
print(argv[1]);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/233201.html
標籤:應用程序開發區
上一篇:Linux操作題,大家來看看吧
下一篇:linux進行網路配置
