• 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
    ",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/
    ",depth," ",entry->d_name);
    27             printdir(entry->d_name,depth+4);
    28         }
    29         else
    30              printf("%*s%s/
    ",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
    ");
        else
        printf(" link is error
    ");
    }

      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]="";
        unsigned char temp[14]="";
        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
    ",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
    ");
     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
    ");
     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
    ",entry);
     60     fread(pis,8,1,fis);
     61 
     62     if(pis[0]==BMP)
     63     {
     64         flag=1;
     65         printf("it is a bmp
    ");
     66     }
     67     else if(pis[0]==JPG)
     68     {
     69         flag=2;
     70         printf("it is a jpg
    ");
     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
    ");
     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
    ");
     81     }
     82     return flag;
     83 
     84 
     85 }
     86 void wrtlog()/*将文件的路径写入路径中*/
     87 {
     88     printf("write to wrtlg
    ");
     89     fprintf(fp,"%s/%s
    ",getcwd(NULL,1024),entry->d_name);
     90     fprintf(fbmp,"%s
    ",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,"文件名                    /状态            /时间            /
    ");
     98   ++i;
     99   fprintf(flog,"%s		删除		 ",name);
    100 
    101   fprintf(flog,"%s
    ",ctime(&the_time));
    102   //fprintf(flog,"%02d:%02d:%02d:%02d:%02d:%02d
    ",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
    ");
    108     if((dp=opendir(dir))==NULL)
    109     {
    110         fprintf(stderr,"cannot open directory:%s
    ",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         else
    124             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]="";
    134     unsigned char temp[14]="";
    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
    ",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         else
    162             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
    ");
    188     }
    189       else
    190     printf(" link is error
    ");
    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
    ",path2);
    210         wrlog(path2);
    211       }
    212     else
    213       printf("unlink %s is error
    ",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"
    ",topdir);
     9         printf("初始化中");
    10         init();
    11         printf("初始化完毕
    ");
    12         printf("start printdir
    ");
    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
    ",path2);
    21           strcpy(watchdog,path2);
    22     pid_t fork_res;
    23     fork_res=fork();
    24       if(fork_res==0)
    25       {
    26           printf("Child now
    ");
    27         while(del_dir()!=1);
    28         printf("del_dir done.
    ");
    29           return 1;
    30       }
    31       else if(fork_res>0)
    32       { 
    33           printdir(topdir);
    34           printf("printdir done.
    ");
    35           lkbmp();
    36           printf("lkbmp done
    ");
    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 }

      

  • 相关阅读:
    shell 遍历当前目录以及所有子目录下文件
    linux shell 字符串操作(长度,查找,替换)详解
    将自定义结构存入std::set 或者 std::map
    CentOS下搭建SVN服务器
    基于Debian的linux系统软件安装命令
    rm搭配grep删除符合条件的文件
    Centos系统环境
    怎么恢复用mysqldump备份数据和恢复数据
    mac 安装 node.js 的 canvas
    centos 6.5 安装 node.js 的 canvas模块
  • 原文地址:https://www.cnblogs.com/orangebook/p/3548718.html
Copyright © 2020-2023  润新知