附录:程序lx.c
1 #include
2 #include
3 #include
4 #include
5 #include
6 #define TABSPACES 8
7 main(argc,argv)
8 int argc;
9 char **argv;
10 {
11 off_t dir_size;
12 if (argc<2)
13 dir_size=list(".");
14 else if (argc>2)
15 {
16 printf("Usage: lx [path]\n");
17 exit(1);
18 }
19 else
20 dir_size=list(argv[1]);
21 printf(" This directory size is %i bytes.\n",dir_size);
22 }
23 off_t list(name)
24 char *name;
25 {
26 char pn[255];
27 DIR *dp;
28 off_t f_size,d_size;
29 int i;
30 struct stat sbuf;
31 struct direct *dir;
32 f_size=0;
33 printf("Current directory is %s\n",name);
34 for (i=0;i<=1;i++)
35 {
36 if ((dp=opendir(name))==NULL)
37 {
38 perror(name);
39 exit(1);
40 }
41 while ((dir=readdir(dp))!=NULL)
42 {
43 if(dir->d_ino==0)
44 continue;
45 strcpy(pn,name);
46 strcat(pn,"/");
47 strcat(pn,dir->d_name);
48 if (lstat(pn,&sbuf)<0)
49 {
50 perror(pn);
51 exit(1);
52 }
53 if
(((sbuf.st_mode&S_IFMT)!=S_IFLNK)&&((sbuf.st_mode&S_IFMT)==S_IFDIR)&&(strcmp(dir->d_name,".")!=0)&&(strcmp(dir->d_name,"..")!=0))
54 {
55 if (i==1)
56 {
57 d_size=list(pn);
58 f_size=f_size+d_size;
59 }
60 }
61 else
62 {
63 if (i==0)
64 {
65 f_size=f_size+sbuf.st_size;
66 if (strlen(dir->d_name)>=2*TABSPACES)
67 printf("%s\t%i\n",dir->d_name,sbuf.st_size);
68 else if (strlen(dir->d_name)>=TABSPACES)
69 printf("%s\t\t%i\n",dir->d_name,sbuf.st_size);
70 else
71 printf("%s\t\t\t%i\n",dir->d_name,sbuf.st_size);
72 }
73 }
74 }
75 closedir(dp);
76 }
77 return f_size;
78 }