首页 > 系统 > Linux > 正文

Linux项目一

2024-06-28 13:28:04
字体:
来源:转载
供稿:网友
linux项目一

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 }

  


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表