利用Linux有關系統調用函數編寫一個文件工具filetools,要求具有下列功能:
1 #include<stdio.h> 2 #include<sys/types.h> 3 #include<unistd.h> 4 #include<fcntl.h> 5 #include<sys/stat.h> 6 #include<syslog.h> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<dirent.h> 10 void menu();//選擇菜單 11 void createfile();// 創建文件 12 void readfile();//讀取文件 13 void writefile();//寫文件 14 void copyfile();//復制文件 15 void chmd();//修改文件權限 16 void dispmode();//查看文件權限 17 void createdir();//創建目錄 18 void lsdir();//查看目錄 19 void dedir();//刪除目錄 20 void cd();//切換當前目錄 21 void lnfile();//建立符號鏈接 22 23 void menu() 24 { 25 printf("********************************\n"); 26 printf("******* filetools ******\n"); 27 printf("****** 0.退出 *****\n"); 28 printf("***** 1.創建新文件 ****\n"); 29 printf("***** 2.寫文件 ****\n"); 30 printf("***** 3.讀文件 ****\n"); 31 printf("***** 4.復制文件 ****\n"); 32 printf("***** 5.修改文件權限 ****\n"); 33 printf("***** 6.查看文件權限 ****\n"); 34 printf("***** 7.創建目錄 ****\n"); 35 printf("***** 8.查看目錄 ****\n"); 36 printf("***** 9.刪除目錄 ****\n"); 37 printf("****** 10.切換當前目錄 *****\n"); 38 printf("******* 11.建立符號鏈接 ******\n"); 39 printf("********************************\n"); 40 } 41 void createfile(char *file)//創建文件 42 { 43 int fd; 44 if((fd = open(file,O_CREAT|O_TRUNC|O_RDWR,0666))<0)//已存在文件即可打開,未存在文件則創建文件 45 perror("open"); 46 else 47 printf("創建文件成功!\n"); 48 if(close(fd))//判斷文件是否關閉 49 perror("close"); 50 else 51 printf("Close file!\n"); 52 } 53 54 55 void readfile(char *file) 56 { 57 int fd,size; 58 char b[105]; 59 if((fd = open(file,O_RDONLY))<0)//判斷是否打開 60 perror("open"); 61 else 62 printf("Open file!"); 63 if((size = read(fd,b,sizeof(b)))<0)//判斷是否讀成功 64 perror("read"); 65 else 66 printf("read from file:%s\n",b); 67 if(close(fd)<0)//判斷文件是否關閉 68 perror("close"); 69 else 70 printf("Close file!\n"); 71 } 72 void writefile(char *file)//寫文件 73 { 74 int fd,size,len; 75 char *buf="Hello!Iam林佳音!!!";//寫文件的內容 76 len = strlen(buf); 77 if((fd = open(file,O_CREAT|O_TRUNC|O_RDWR,0666))<0)//判斷是否打開 78 perror("open"); 79 else 80 printf("Open file!\n"); 81 if((size = write(fd,buf,len))<0)//判斷是否寫入成功 82 perror("write"); 83 else 84 printf("Write:%s\n",buf); 85 if(close(fd)<0)//判斷文件是否關閉 86 perror("close"); 87 else 88 printf("Close file!\n"); 89 } 90 91 void copyfile(char *file, char *p)//傳入文件和待拷貝文件 92 { 93 if(fork()==0) 94 execlp("/bin/cp","cp",file,p,NULL); 95 else 96 wait(0); 97 printf("將%s文件內容復制到%s\n",file,p); 98 } 99 100 void chmd(char *filename)//復制實驗書上代碼 101 { 102 int c; 103 mode_t mode=S_IWUSR;//mode值 104 printf(" 0. 0700\n 1. 0400\n 2. 0200 \n 3. 0100\n"); //還可以增加其它權限 105 printf("Please input your choice(0-3):"); 106 scanf("%d",&c); 107 switch(c) 108 { 109 case 0: 110 chmod(filename,S_IRWXU); 111 break; 112 case 1: 113 chmod(filename,S_IRUSR); 114 break; 115 case 2: 116 chmod(filename,S_IWUSR); 117 break; 118 case 3: 119 chmod(filename,S_IXUSR); 120 break; 121 default: 122 printf("You have a wrong choice!\n"); 123 } 124 } 125 126 127 void dispmode(char *filename)//查看文件權限 128 { 129 char* path="/bin/ls"; 130 char* argv[4]= {"ls","-l",filename,NULL}; 131 execv(path,argv); //執行ls –l file1 132 } 133 134 135 void createdir(char *file)//創建文件夾 136 { 137 if(mkdir(file,S_IRWXU)<0) 138 perror("Mkdir"); 139 else 140 printf("創建文件夾成功\n"); 141 } 142 143 144 145 void lsdir(char *dir, int depth)//遞歸查看目錄下的文件,參考百度 146 { 147 DIR *dp; 148 struct dirent *entry; 149 struct stat statbuf; 150 //結構體 151 152 if ((dp = opendir(dir)) == NULL)//判斷是否能打開文件 153 { 154 fprintf(stderr, "Can`t open directory %s\n", dir); 155 return ; 156 } 157 158 chdir(dir); 159 while ((entry = readdir(dp)) != NULL) 160 { 161 lstat(entry->d_name, &statbuf); 162 if (S_ISDIR(statbuf.st_mode)) 163 { 164 if (strcmp(entry->d_name, ".") == 0 || 165 strcmp(entry->d_name, "..") == 0 ) 166 continue; 167 printf("%*s%s/\n", depth, "", entry->d_name); 168 lsdir(entry->d_name, depth+4);//遞歸式查找 169 } 170 else 171 printf("%*s%s\n", depth, "", entry->d_name);//輸出目錄下文件 172 } 173 chdir(".."); 174 closedir(dp); 175 } 176 177 void dedir(char *path) 178 { 179 printf("不會遞歸寫刪除子目錄\n"); 180 } 181 182 183 184 void cd(char *file) 185 { 186 if(chdir(file)<0) 187 perror("chdir"); 188 else 189 printf("切換目錄成功\n"); 190 } 191 192 void lnfile(char *a, char *b) 193 { 194 if(link(a,b) < 0) 195 perror("Link"); 196 else 197 printf("已建立連接\n"); 198 } 199 200 int main() 201 { 202 //打印菜單 203 menu(); 204 int num; 205 printf("請選擇您要操作的內容的序號:"); 206 while(1) 207 { 208 scanf("%d", &num); 209 if(num == 0) 210 { 211 printf("已退出\n"); 212 return 0; 213 } 214 else if(num > 0 && num <= 11) 215 { 216 switch(num) 217 { 218 case 1: 219 createfile("/home/xmonkey/3171916105.txt"); 220 break; 221 case 2: 222 writefile("/home/xmonkey/hello.txt"); 223 break; 224 case 3: 225 readfile("/home/xmonkey/hello.txt"); 226 break; 227 case 4: 228 copyfile("/home/xmonkey/hello.txt","/home/xmonkey/hello.c"); 229 break; 230 case 5: 231 chmd("/home/xmonkey/hello.txt"); 232 break; 233 case 6: 234 dispmode("/home/xmonkey/hello.txt"); 235 break; 236 case 7: 237 createdir("/home/xmonkey/3171916105"); 238 break; 239 case 8: 240 lsdir("/home/xmonkey/file",0); 241 break; 242 case 9: 243 dedir("/home/xmonkey/file"); 244 break; 245 case 10: 246 cd("/home/xmonkey/file"); 247 break; 248 case 11: 249 lnfile("/home/xmonkey/hello.txt","/home/xmonkey/3171916105.txt"); 250 break; 251 252 } 253 } 254 else 255 { 256 printf("序號出錯,請重新輸入!\n"); 257 } 258 } 259 260 }