1 #include "factory.h"
2
3 typedef struct{
4 int data_len;
5 char buf[65535];
6 }train_t,p_train_t;
7
8
9 char *trans_file_access_form(void* file_stat);
10
11 int my_ls(char *pwdnow,int newfd){
12 int ret;
13 DIR *dir = opendir(pwdnow);
14 ERROR_CHECK(dir,(DIR*)-1,"opendir");
15 struct dirent *p = NULL;
16 struct stat buf;
17 char *test =(char*)malloc(65535);
18 int test_size = 0;
19 train_t train;
20 while((p=readdir(dir)))
21 {
22 if(strcmp(p->d_name,".") && strcmp(p->d_name,".."))
23 {
24 ret=stat(p->d_name,&buf);
25 ERROR_CHECK(ret,-1,"stat");
26 char *ret_from_ctime = ctime(&buf.st_mtime);
27 ret_from_ctime[16] = '\0';
28 ret=sprintf(test+test_size,"%s %ld %s %s %-ld %s %s\n",trans_file_access_form(&buf),buf.st_nlink,getpwuid(buf.st_uid)->pw_name,\
29 getgrgid(buf.st_gid)->gr_name,buf.st_size,ret_from_ctime+4,p->d_name);
30 test_size += ret;
31 }
32 }
33 train.data_len = strlen(test);
34 memcpy(train.buf,test,train.data_len);
35 send(newfd,&train,4+train.data_len,0);
36 closedir(dir);
37 return 0;
38 }
39 char *trans_file_access_form(void* file_stat){
40 struct stat *buf = (struct stat *)file_stat;
41 int decimal_form = buf->st_mode & S_IFMT;
42 char *ret = (char *)calloc(11, sizeof(char));
43 char types[] = "xwrpcdb-ls";
44 ret[0] = types[(decimal_form >>= 12) / 2 + 3];
45 decimal_form = buf->st_mode;
46 int pos = 9;
47 for (int i = 0; i < 3; ++i)
48 {
49 for (int j = 0; j < 3; ++j,decimal_form >>= 1)
50 {
51 if (decimal_form & 1)
52 {
53 ret[pos--] = types[j];
54 }
55 else
56 {
57 ret[pos--] = types[7];
58 }
59 }
60 }
61 return ret;
62 }
接口可直接移植使用(头文件不多,可自行man 相关接口添加)
比如total num的尚未打印(多几行代码而已)
待完善…
本文详细介绍了C语言中如何进行文件系统操作,包括目录读取、文件属性获取及权限字符串转换。通过具体代码实现,展示了如何用C语言枚举目录下的文件,并解析文件的权限、链接数、所有者、组、大小和修改时间。
1179

被折叠的 条评论
为什么被折叠?



