Linux项目一
引言:
这是我去年做的东西,一直没有时间整理,今天又要做一个基于这个项目的客户端与服务器版本。
以前我写的库文件中的函数耦合度很大,在一个函数中调用另一个函数,导致一无法拆开使用!
因此,我对以前写的库进行接口的更改,以更好的适应更多的项目。
当然我也把以前写的小程序贴出来,以供大家参考!
需求:
1.搜索bmp图片转换成黑白图片复制到另一个文件中
2.系统为Linux
自定义功能函数:
1.打印目录:
1 #include<unistd.h> 2 #include<stdio.h> 3 #include<dirent.h> 4 #include<string.h> 5 #include<sys/stat.h> 6 #include<stdlib.h> 7 void PRintdir(char *dir,int depth)/*打印目录*/ 8 { 9 DIR *dp;10 struct dirent *entry;11 struct stat statbuf;12 13 if((dp=opendir(dir))==NULL)14 {15 fprintf(stderr,"cannot open directory:%s/n",dir);16 return;17 }18 chdir(dir);19 while((entry=readdir(dp))!=NULL)20 {21 lstat(entry->d_name,&statbuf);/**获取文件信息,保存在statbuf**/22 if(S_ISDIR(statbuf.st_mode))/***判断是否为目录***/23 {24 if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)25 continue;26 printf("%*s%s//n",depth," ",entry->d_name);27 printdir(entry->d_name,depth+4);28 }29 else30 printf("%*s%s//n",depth," ",entry->d_name);/***为文件***/31 }32 chdir("..");33 closedir(dp);34 }
2.删除文件:
1 #include<unistd.h>2 void del_file(const char *filename)3 {4 unlink(filename);5 return 1;6 }
3.复制文件:
#include<unistd.h>void lkbmp(const char *source,const char *target){ if(link(source,target)==0) printf(" link is successful/n"); else printf(" link is error/n");}
4.对彩色图片转换成黑白图片
#include<stdio.h>#include<string.h>int bmp(char filename[]){ FILE *fo,*fin; RGN rgb,black={0,0,0,0},white={255,255,255,0}; char name[256]="/0"; unsigned char temp[14]="/0"; unsigned int offset=0; /***在文件名中添加copy_来区别原文件***/ int len=strlen(filename); strncpy(name,filename,len-4); strcat(name,"_copy.bmp"); if((fo=fopen(filename,"rb+"))==NULL) printf("can not open %s",filename); if((fin=fopen(name,"wb+"))==NULL) printf("can not open %s",name); fseek(fo,10,0); fread(&offset,4,1,fo); printf("%X/n",offset); fseek(fo,0,0); unsigned int i=1; while(i<=offset) { fread(temp,1,1,fo); fwrite(temp,1,1,fin); i+=1; } while(!feof(fo)) { fread(&rgb,4,1,fo); if((rgb.Blue+rgb.Green+rgb.Red)/3<125) fwrite(&black,4,1,fin); else fwrite(&white,4,1,fin); } fclose(fo); fclose(fin); return 0;}
完整自定义库文件:
1 #include<unistd.h> 2 #include<stdio.h> 3 #include<dirent.h> 4 #include<string.h> 5 #include<stdlib.h> 6 #include<sys/stat.h> 7 #include<sys/types.h> 8 #include<sys/wait.h> 9 #include<stdlib.h> 10 #include<time.h> 11 #include <sys/msg.h> 12 FILE *fp,*fbmp,*flog; 13 struct dirent *entry; 14 struct stat statbuf; 15 unsigned short BMP=0x4D42, 16 JPG=0xD8FF, 17 PNG[4]={0x5089,0x474E,0x0A0D,0x0A1A}, 18 GIF[3]={0x4947,0x3846,0x6139}; 19 static char path1[256],path2[256],watchdog[256],name[256]; 20 struct tm *tm_ptr; 21 time_t the_time; 22 23 //判断图片头文件的结构体 24 typedef struct tagRGBQUAD 25 { 26 unsigned char Blue;// À¶É«µÄÁÁ¶È£šÖµ·¶Î§Îª0-255) 27 unsigned char Green; // ÂÌÉ«µÄÁÁ¶È£šÖµ·¶Î§Îª0-255) 28 unsigned char Red; // ºìÉ«µÄÁÁ¶È£šÖµ·¶Î§Îª0-255) 29 unsigned char Reserved;// ±£Áô£¬±ØÐëΪ0 30 } RGN; 31 32 void init()/*用于初始化程序*/ 33 { 34 printf("file opened now/n"); 35 fp=fopen("wrg.text","w+"); 36 flog=fopen("wrlog.text","w+"); 37 fbmp=fopen("bmpname.text","w+"); 38 } 39 void Exit() 40 { 41 printf("everything is gone/n"); 42 fclose(fp); 43 fclose(fbmp); 44 fclose(flog); 45 } 46 int istupian(char entry[]) 47 /*返加值为 48 1 bmp; 49 2 jpg; 50 3 png; 51 4 gif; 52 */ 53 { 54 FILE *fis; 55 short int i=0; 56 unsigned short pis[5]; 57 int flag=0;//每次调用都进行初始化 58 if((fis=fopen(entry,"r"))==NULL) 59 printf("can not read %s/n",entry); 60 fread(pis,8,1,fis); 61 62 if(pis[0]==BMP) 63 { 64 flag=1; 65 printf("it is a bmp/n"); 66 } 67 else if(pis[0]==JPG) 68 { 69 flag=2; 70 printf("it is a jpg/n"); 71 } 72 else if(PNG[0]==pis[0]&&PNG[1]==pis[1]&&PNG[2]==pis[2]&&PNG[3]==pis[3]) 73 { 74 flag=3; 75 printf("it is a png/n"); 76 } 77 else if(GIF[0]==pis[0]&&GIF[1]==pis[1]&&GIF[2]==pis[2]) 78 { 79 flag=4; 80 printf("it is a gif/n"); 81 } 82 return flag; 83 84 85 } 86 void wrtlog()/*将文件的路径写入路径中*/ 87 { 88 printf("write to wrtlg/n"); 89 fprintf(fp,"%s/%s/n",getcwd(NULL,1024),entry->d_name); 90 fprintf(fbmp,"%s/n",entry->d_name); 91 } 92 void wrlog(char name[])// 将日记写入文件中 93 { 94 static int i=0; 95 (void)time(&the_time); 96 //tm_ptr=gmtime(&the_time); 97 if(i==0) fprintf(flog,"文件名 /状态 /时间 //n"); 98 ++i; 99 fprintf(flog,"%s/t/t删除/t/t ",name);100 101 fprintf(flog,"%s/n",ctime(&the_time));102 //fprintf(flog,"%02d:%02d:%02d:%02d:%02d:%02d/n",tm_ptr->tm_year,tm_ptr->tm_mon+1,tm_ptr->tm_mday,tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec);103 }104 void printdir(char dir[])/*打印目录*/105 {106 DIR *dp;107 printf("printdir ******doing now/n");108 if((dp=opendir(dir))==NULL)109 {110 fprintf(stderr,"cannot open directory:%s/n",dir);111 return;112 }113 chdir(dir);114 while((entry=readdir(dp))!=NULL)115 {116 lstat(entry->d_name,&statbuf);117 if(S_ISDIR(statbuf.st_mode))118 {119 if(strcmp(".",entry->d_name)==0||strcmp("..",entry->d_name)==0)120 continue;121 printdir(entry->d_name);122 }123 else124 wrtlog();125 }126 chdir("..");127 closedir(dp);128 }129 int bmp(char filename[])130 {131 FILE *fo,*fin;132 RGN rgb,black={0,0,0,0},white={255,255,255,0};133 char name[256]="/0";134 unsigned char temp[14]="/0";135 unsigned int offset=0;136 /***在文件名中添加copy_来区别原文件***/137 int len=strlen(filename);138 strncpy(name,filename,len-4);139 strcat(name,"_copy.bmp");140 141 if((fo=fopen(filename,"rb+"))==NULL)142 printf("can not open %s",filename);143 if((fin=fopen(name,"wb+"))==NULL)144 printf("can not open %s",name);145 fseek(fo,10,0);146 fread(&offset,4,1,fo);147 printf("%X/n",offset);148 fseek(fo,0,0);149 unsigned int i=1;150 while(i<=offset)151 {152 fread(temp,1,1,fo);153 fwrite(temp,1,1,fin);154 i+=1;155 }156 while(!feof(fo))157 {158 fread(&rgb,4,1,fo);159 if((rgb.Blue+rgb.Green+rgb.Red)/3<125)160 fwrite(&black,4,1,fin);161 else162 fwrite(&white,4,1,fin);163 }164 165 fclose(fo);166 fclose(fin);167 return 0;168 }169 //硬连接170 /*返加值为171 1 bmp;172 2 jpg;173 3 png;174 4 gif;175 */176 void lkbmp()177 {178 fseek(fp,0,0);179 fseek(fbmp,0,0);180 while(fscanf(fp,"%s",path1)!=EOF&&fscanf(fbmp,"%s",name)!=EOF)181 {182 /***path2 的路径已经初始化,将文件名接到path2中,链接好后,将watchsog重新载入watchdog中***/183 strcat(path2,name);184 printf("%s",path2);185 if(link(path1,path2)==0)186 {187 printf(" link is successful/n");188 }189 else190 printf(" link is error/n");191 //恢复母路径192 if(istupian(path2)==1)193 bmp(path2);194 strcpy(path2,watchdog);195 }196 197 }198 //删除非图片文件199 int del_dir()200 {201 fseek(fp,0,0);202 fseek(fbmp,0,0);203 while(fscanf(fbmp,"%s",name)!=EOF)204 {205 //path2 的路径已经初始化,将文件名接到path2中,链接好后,将watchsog重新载入watchdog中206 strcat(path2,name);207 if(!istupian(path2)&&unlink(path2)==0)208 {unlink(path2);209 printf("unlink %s is successful/n",path2);210 wrlog(path2);211 }212 else213 printf("unlink %s is error/n",path2);214 //恢复母路径215 strcpy(path2,watchdog);216 }217 return 1;218 219 }
对应的执行文件:
1 #include"myhead.h" 2 #pragma pack(2) 3 int main(int argc,char *argv[]) 4 { 5 char topdir[128] = "."; 6 if(argc>=2) 7 strcpy(topdir,argv[1]); 8 printf("已经得到目录:/"%s/"/n",topdir); 9 printf("初始化中");10 init();11 printf("初始化完毕/n");12 printf("start printdir/n");13 printf("进入原始路径,得到母路径。");14 chdir(topdir);15 chdir("..");16 strcpy(path2,getcwd(NULL,1024));17 //创建D目录,可以以作为子进程18 strcat(path2,"/D/");19 mkdir(path2,0770);20 printf("母路径:%s/n",path2);21 strcpy(watchdog,path2);22 pid_t fork_res;23 fork_res=fork();24 if(fork_res==0)25 {26 printf("Child now/n");27 while(del_dir()!=1);28 printf("del_dir done./n");29 return 1;30 }31 else if(fork_res>0)32 { 33 printdir(topdir);34 printf("printdir done./n");35 lkbmp();36 printf("lkbmp done/n");37 del_dir();38 return 0 ;39 }40 else 41 { perror("fork failed");42 exit(1);43 }44 45 46 47 printf("程序运行结束"); 48 exit(0);49 }
新闻热点
疑难解答