Как скопировать один файл в другой раздел в Linux, используя C - PullRequest
2 голосов
/ 03 ноября 2011

переименовать (), ссылка () не работает

Спасибо!

Ответы [ 3 ]

4 голосов
/ 03 ноября 2011

Вы пытались использовать стандартные старые функции C?

`fopen` the source on one partition
`fopen` the destination on the other partition

LOOP while `fread` > 0
   `fread` from the source to a buff
   `fwrite` to the dest from a buff

А затем закройте свои файлы (т. Е. fclose).

Это также больше Portable.

РЕДАКТИРОВАТЬ: Если вы хотите, чтобы это было действительно просто, почему бы просто не использовать язык сценариев (python / bash) и сделать это в несколько строк.

0 голосов
/ 03 ноября 2011

Вот как бы я это сделал.Это довольно просто и оставляет сложную часть фактического копирования инструменту cp, который успешно выполнял эту задачу в течение нескольких лет.

#include <assert.h>
#include <string.h>

#include <sys/wait.h>
#include <unistd.h>

int
runvp(int *ret_status, const char *command, const char * const *argv)
{
  pid_t pid;
  int status;
  char * const *execv_argv;

  pid = fork();
  if (pid == (pid_t) -1)
    return -1;

  if (pid == 0) {
    /*
     * Circumvent the C type conversion rules;
     * see ISO C99: 6.5.16.1#6 for details.
     */
    assert(sizeof(execv_argv) == sizeof(argv));
    memcpy(&execv_argv, &argv, sizeof(execv_argv));

    (void) execvp(command, execv_argv);
    return -1;
  }

  if (waitpid(pid, &status, 0) == -1)
    return -1;

  *ret_status = status;
  return 0;
}

Это оболочка для fork и execvpчто я написал несколько лет назад.Это можно использовать так:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  int exitcode;
  const char *cmdline[] = {
    "cp",
    "--",
    argv[1],
    argv[2],
    NULL
  };

  if (runvp(&exitcode, cmdline[0], cmdline) == -1) {
    perror("runvp");
    return EXIT_FAILURE;
  }
  return EXIT_SUCCESS;
}
0 голосов
/ 03 ноября 2011

переименовать () должно работать. Вы проверили ошибку, которая возвращается? rename () возвращает 0, если это удалось согласно документации:

http://www.cplusplus.com/reference/clibrary/cstdio/rename/

Вы можете использовать perror () для вывода строки ошибки в стандартную ошибку (stderr, обычно экран):

http://www.cplusplus.com/reference/clibrary/cstdio/perror/

...