Как я могу более эффективно копировать файл в резюме? - PullRequest
0 голосов
/ 11 июня 2018

Я вызываю функцию ниже непрерывно после интервала 500 мс.

По сути, эта функция будет копировать байты из исходного файла в файл назначения при добавлении дополнительных байтов в исходный файл.

Я хочу сделать это намного быстрее для своей встроенной платформы.

int CopyResume(CHAR8 *src_file, CHAR8 *dst_file)
{
   int    status               = SUCCESS;
   FILE                    *fp_read             = NULL;
   FILE                    *fp_write            = NULL;
   long                    size_src             = 0L;
   long                    size_dst             = 0L;
   long                    size                 = 0L;
   char                    *buffer              = NULL;

   do
   {
      fp_read = fopen(src_file,"r");
      if(NULL == fp_read)
      {
         status = FAIL;
         break;
      }
      fp_write = fopen(dst_file,"a+");
      if(NULL == fp_write)
      {
         status = FAIL;
         break;
      }

      fseek(fp_write, 0L , SEEK_END);
      size_dst = ftell(fp_write);
      fseek(fp_read, 0L, SEEK_END);
      size_src = ftell(fp_read);
      fseek(fp_read, size_dst, SEEK_SET);

      size = (size_src - size_dst);
      if(size <= 0)
      {
         break;
      }

      buffer = (char*) malloc (sizeof(char) * size + 1);
      if (buffer == NULL)
      {
         status = FAIL;
         break;
      }

      if(fread (buffer,1,size, fp_read) != size)
      {
         status = FAIL;
         break;
      }
      // Write Buffer
      if(fwrite(buffer, 1, size, fp_write) != size)
      {
         status = FAIL;
         break;
      }
   }while(0);

   if(NULL != fp_write)
   {
      fflush(fp_write);
      fsync(fileno(fp_write));
      usleep(1000);
      fclose(fp_write);
      fp_write = NULL;
   }
   if(NULL != fp_read)
   {
      fflush(fp_read);
      fsync(fileno(fp_read));
      usleep(1000);
      fclose(fp_read);
      fp_read = NULL;
   }
   if(NULL != buffer)
   {
      free (buffer);
   }
   return status;
}

Моя функция занимает ~ 100 мс для копирования 115 КБ данных из SRC в DST.

Как я могу оптимизировать этофункция, чтобы сделать это быстрее?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...