• C++ 实现文件/文件夹的复制、移动、删除等接口


    0.头文件

    #include "stdio.h"
    #include "stdlib.h"
    #include "unistd.h"
    #include <dirent.h>
    #include <string.h>
    #include <sys/stat.h>
    #include <sstream>
    #include <iostream>
    #include <fstream>
    #include <cstdio>

    1、复制文件

     1 bool copyFile(const String& source, const String& target)
     2 {    
     3     bool bRet = false;    int iRet , iRead , size , iWrite;
     4     FILE* fS = NULL , *fD = NULL;
     5     char fileName[25] ={0};
     6     char buf[100] ="";
     7     char cmd[125] ="";
     8     char* buffer = NULL;
     9     int iPos = target.reverseFind('/');
    10     
    11     char* src = (char*)malloc(256*sizeof(char));
    12     int src_len = strlen((char *)source.ascii().data());
    13     memcpy(src, (char *)source.ascii().data(), src_len);
    14     src[src_len] = '\0';
    15    
    16     char* des =  (char*)malloc(256*sizeof(char));
    17     int des_len = strlen((char *)target.ascii().data());
    18     memcpy(des, (char *)target.ascii().data(), des_len);
    19     des[des_len] = '\0';
    20 
    21     if (iPos+1 != des_len)
    22     {
    23         strcat(des,"/");
    24     }
    25 
    26     iRet = access(src, F_OK);
    27     if (iRet) 
    28     {
    29       return false; //源文件不存在.
    30     }
    31     fS = fopen(src, "r");
    32     if (fS == NULL) 
    33     {
    34       return false; //源文件打开失败
    35     }
    36 
    37     DIR* dir;
    38     if((dir = opendir(des)) == NULL)
    39     {
    40       goto finish;
    41     } 
    42     // strncpy(fileName,src+12,strlen(src) -12);//"/mnt/sdcard/"
    43     strncpy(buf,des,strlen(des));
    44     strcat(buf,fileName);
    45 
    46     sprintf(cmd, "touch %s",buf);
    47     system(cmd);//创建目标文件
    48     
    49     fD = fopen(buf, "w+");
    50     if (fD == NULL) 
    51     {
    52       goto finish;
    53     }
    54     fseek(fS, 0, SEEK_END);
    55     size = ftell(fS);    //文件首尾偏移的字节数
    56     fseek(fS, 0, SEEK_SET); //把fp指针移动到文件开头
    57     buffer = (char*) calloc(1, size + 1); 
    58     if (!buffer) 
    59     {
    60       goto finish;
    61     }
    62     iRead = fread(buffer, 1, size, fS);  //成功读取的元素个数
    63     if (iRead != size) 
    64     {
    65       goto finish;
    66     }
    67     iWrite = fwrite((void*)buffer, 1,  size, fD); //写入目标文件
    68     if (iWrite != size) 
    69     {
    70       goto finish;
    71     }
    72     bRet = true;
    73     finish:
    74     if (fS)
    75         fclose(fS);
    76     if (fD)
    77         fclose(fD);
    78     if (buffer)
    79         free(buffer);
    80     free(src);
    81     src = NULL;
    82     free(des);
    83     des = NULL;
    84     closedir(dir);
    85     return bRet;
    86 }

    2、移动文件

     1 bool moveFile(const String& source, const String& target)
     2 {
     3     bool bRet = false;
     4     int iRet , iRead , size , iWrite ;
     5     FILE* fS = NULL , *fD = NULL;
     6     char fileName[25] ={0};
     7     char buf[100] ="";
     8     char cmd[125] ="";
     9     char* buffer = NULL;    
    10     int iPos = target.reverseFind('/');
    11 
    12     char* src = (char*)malloc(256*sizeof(char));
    13     int src_len = strlen((char *)source.ascii().data());
    14     memcpy(src, (char *)source.ascii().data(), src_len);
    15     src[src_len] = '\0';
    16     
    17     char* des =  (char*)malloc(256*sizeof(char));
    18     int des_len = strlen((char *)target.ascii().data());
    19     memcpy(des, (char *)target.ascii().data(), des_len);
    20     des[des_len] = '\0';
    21     if (iPos+1 != des_len)
    22     {
    23        strcat(des,"/");
    24     }
    25     
    26     iRet = access(src, F_OK); 
    27     if (iRet) 
    28     {
    29         return false;  //源文件不存在
    30     }
    31     fS = fopen(src, "r");
    32     if (fS == NULL) 
    33     {        
    34         return false;  // 源文件打开失败
    35     }
    36 
    37     DIR* dir;
    38     if((dir = opendir(des)) == NULL)
    39     {
    40         goto finish; //目标路径不存在
    41     } 
    42 
    43     // strncpy(fileName,src+12,strlen(src) -12);//"/mnt/sdcard/"
    44     strncpy(buf,des,strlen(des));
    45     strcat(buf,fileName);
    46     LOGD("fileName= [%s] buf=%s",fileName,buf);
    47     
    48     sprintf(cmd, "touch %s",buf);
    49     system(cmd);
    50 
    51 
    52     fD = fopen(buf, "w+");
    53     if (fD == NULL) 
    54     {   
    55         goto finish;
    56     }
    57 
    58     fseek(fS, 0, SEEK_END);
    59     size = ftell(fS);        
    60     fseek(fS, 0, SEEK_SET); 
    61     buffer = (char*) calloc(1, size + 1); 
    62     
    63     if (!buffer) 
    64     {
    65         goto finish;
    66     }
    67     iRead = fread(buffer, 1, size, fS); 
    68     if (iRead != size) 
    69     {
    70         goto finish;
    71     }
    72     iWrite = fwrite((void*)buffer, 1,  size, fD);
    73     if (iWrite != size) 
    74     {
    75         goto finish;
    76     }
    77     
    78     if(remove(src)==0)  //删除源文件
    79     {
    80         bRet = true;
    81     }
    82 
    83     finish:
    84     if (fS)
    85         fclose(fS);
    86     if (fD)
    87         fclose(fD);
    88     if (buffer)
    89         free(buffer);
    90     free(src);
    91     src = NULL;
    92     free(des);
    93     des = NULL;
    94     closedir(dir);
    95     return bRet;
    96     
    97 }        

    3、删除文件

     1 bool deleteFile(const String& path)
     2 {
     3     bool bRet = false;  
     4     char* src = (char *)path.utf8().data();
     5     int iRet;
     6     iRet = access(src, F_OK);
     7     if (iRet)  //文件不存在
     8     {
     9     }
    10     else
    11     {                   
    12         if(remove(src)==0) 
    13     {
    14             bRet = true;
    15         }
    16         else //移除文件失败
    17         {
    18         }
    19     }
    20     return bRet;
    21 }        

    4、判断文件是否存在

     1 bool existLocalFile(const String& path)
     2 {
     3     bool bRet = false;
     4     int iRet;
     5     char* src = (char *)path.utf8().data();
     6     iRet = access(src,F_OK);    
     7     if (iRet)  //源文件不存在
     8     {
     9     }
    10     else
    11     {
    12          bRet = true;
    13     }
    14     return bRet;
    15 }

    5、复制文件夹

      1 bool copyDirectory(const String& source, const String& target)
      2 {
      3     bool bRet = false;
      4 
      5     char* src = (char*)malloc(256*sizeof(char));
      6     int src_len = strlen((char *)source.ascii().data());
      7     memcpy(src, (char *)source.ascii().data(), src_len);
      8     src[src_len] = '\0';
      9     
     10     char* dest =  (char*)malloc(256*sizeof(char));
     11     int des_len = strlen((char *)target.ascii().data());
     12     memcpy(dest, (char *)target.ascii().data(), des_len);
     13     dest[des_len] = '\0';
     14  
     15     DIR *dirp = NULL;
     16     int iRet;
     17     iRet = access(src, F_OK);
     18     if (iRet) 
     19     {  
     20         return false;  //源文件不存在
     21     }
     22     
     23     //1.open the dir
     24     if(NULL ==(dirp = opendir(src)))
     25     {
     26         return false;
     27     }
     28 
     29     struct dirent *entp = NULL;
     30     //2.read the dir
     31     while(NULL != (entp = readdir(dirp)))
     32     { 
     33         if( 0 == (strcmp(entp->d_name,"..")) || 0 == (strcmp(entp->d_name, ".")))
     34         {
     35             continue;
     36         }
     37 
     38         char src_buf[100] = "";
     39         char dest_buf[100] = "";
     40 
     41         sprintf(src_buf, "%s/%s", src, entp->d_name);
     42         sprintf(dest_buf, "%s/%s", dest, entp->d_name); 
     43 
     44         struct stat src_stat;
     45 
     46         if( stat(src_buf,&src_stat) )
     47         {   
     48             goto finish; //get stat failed
     49         }
     50         if( S_ISREG(src_stat.st_mode) )
     51         {     
     52             int iRet , iRead , size , iWrite;
     53             FILE* fS = NULL , *fD = NULL;
     54             char* buffer = NULL;
     55             iRet = access(src_buf, F_OK);
     56             if (iRet) 
     57             {
     58                 return false;
     59             }
     60             fS = fopen(src_buf, "r");
     61             if (fS == NULL) 
     62             {
     63                 return false;
     64             }
     65             fD = fopen(dest_buf, "w+");
     66             if (fD == NULL) 
     67             {
     68                 goto finish;
     69             }
     70 
     71             fseek(fS, 0, SEEK_END);
     72             size = ftell(fS);  
     73             fseek(fS, 0, SEEK_SET); 
     74             buffer = (char*) calloc(1, size + 1); 
     75             if (!buffer) 
     76             {
     77                 goto finish;
     78             }
     79             
     80             iRead = fread(buffer, 1, size, fS);
     81             if (iRead != size) 
     82             {
     83                 goto finish;
     84             }
     85             
     86             iWrite = fwrite((void*)buffer, 1,  size, fD);
     87             if (iWrite != size) 
     88             {
     89                 goto finish;
     90             }
     91             if (fS)
     92             fclose(fS);
     93             if (fD)
     94             fclose(fD);
     95             if (buffer)
     96             free(buffer);
     97         }
     98         else if( S_ISDIR(src_stat.st_mode) )
     99         { 
    100             if( -1 == mkdir(dest_buf, src_stat.st_mode) )
    101             {   
    102                 goto finish;
    103             }
    104             copyDirectory(src_buf, dest_buf);  //if subdir, recursive call itself
    105         }
    106     }
    107     bRet = true;
    108 
    109     finish:
    110     if (dirp)
    111         closedir(dirp);
    112     free(src);
    113     src = NULL;
    114     free(dest);
    115     dest = NULL;
    116     return bRet;
    117 }

    6、移动文件夹

     1 bool moveDirectory(const String& source, const String& target)
     2 {
     3     bool bRet = false;
     4     
     5     char* dest =  (char*)malloc(256*sizeof(char));
     6     int des_len = strlen((char *)target.ascii().data());
     7     memcpy(dest, (char *)target.ascii().data(), des_len);
     8     dest[des_len] = '\0';
     9 
    10     char* src = (char*)malloc(256*sizeof(char));
    11     int src_len = strlen((char *)source.ascii().data());
    12     memcpy(src, (char *)source.ascii().data(), src_len);
    13     src[src_len] = '\0';
    14    
    15     int iRet;
    16     iRet = access(src, F_OK);
    17     if (iRet) 
    18     {  
    19         return false;
    20     }
    21     
    22     if(copyDirectory(src,dest))
    23     {
    24         if (deleteDirectory(src))
    25         {
    26             bRet =true;
    27         }
    28         else
    29         {
    30         }
    31     }
    32     else
    33     {
    34     }
    35     return bRet;
    36 
    37 }

    7、删除文件夹

     1 bool deleteDirectory(const String& path)
     2 {
     3     char* src = (char*)malloc(256*sizeof(char));
     4     int src_len = strlen((char *)path.ascii().data());
     5     memcpy(src, (char *)path.ascii().data(), src_len);
     6     src[src_len] = '\0';
     7     
     8     DIR * dir;
     9     int iRet;
    10     bool bRet = false;
    11     iRet = access(src, F_OK);
    12     if (iRet) 
    13     {   
    14         return false;
    15     }
    16     else
    17     {
    18         if((dir = opendir(src)) ==NULL)
    19         {
    20             return false;
    21         }
    22         struct dirent *entp = NULL;
    23         while(NULL != (entp = readdir(dir)))
    24         {   
    25              if( 0 == (strcmp(entp->d_name,"..")) || 0 == (strcmp(entp->d_name, ".")))
    26              {
    27                 continue;
    28              }
    29             char src_buf[100] = "";
    30             sprintf(src_buf, "%s/%s", src, entp->d_name);
    31             LOGD("src_buf = %s",src_buf);
    32             struct stat src_stat;
    33             if( stat(src_buf,&src_stat) ) 
    34             {
    35                 goto finish;
    36             }
    37             
    38             if( S_ISREG(src_stat.st_mode) )
    39             {
    40                 deleteFile(src_buf);
    41             }
    42             
    43             else if( S_ISDIR(src_stat.st_mode) ) 
    44             {
    45                 deleteDirectory(src_buf);  
    46             }
    47                
    48         }
    49         if(remove(src)==0)
    50         {
    51             bRet = true;
    52         } 
    53         finish:
    54         if (dir)
    55             closedir(dir);
    56         free(src);
    57         src = NULL;
    58         return bRet;
    59     }
    60 }
  • 相关阅读:
    批量修改文件的名字
    字节码指令以及操作数栈的分析
    字节码文件的分析
    类加载器详解
    类的加载-连接-初始化
    电商订单ElasticSearch同步解决方案--使用logstash
    springboot整合Mangodb实现crud,高级查询,分页,排序,简单聚合
    mongodb安装教程(亲测有效)
    Azure : 通过 SendGrid 发送邮件
    用java实现删除目录
  • 原文地址:https://www.cnblogs.com/zy791976083/p/9888514.html
Copyright © 2020-2023  润新知