C - Как я могу переместить файл из монтирования CIFS на локальный жесткий диск

Когда я пытаюсь переименовать файл из файла cifs в локальный путь (перемещая файл с сервера на локальный жесткий диск), я получаю -1. Я могу удалить файл, и я могу добавить новые файлы, я просто не могу использовать функцию rename(), чтобы сделать это. Программа запускается от имени пользователя root, и пользователь в монтировании cifs имеет полные права на общий ресурс и локальную файловую систему на сервере.

Сервер: Windows XP SP3 x32

Местный: Ubuntu 13.04 x64

Smb Mount:

sudo mount -t cifs -o username=admin_account,password=<passw> \
  //server/share /local/mount/point

Код C:

void
function moveFile(char *fname){
  char *base;
  base = basename(fname);
  char newF[strlen(getSaveDir()) + strlen(base)];
  sprintf(newF,"%s%s", getSaveDir(), base);
  int result;
  result = rename(fname, newF);
  if( result == 0 ) {
    printf("Moved file: %s to %s", fname, newF);
  } else {
    printf("There was an error moving %s to %s (ID: %d)", fname, newF, result);
    //TODO figure out better fix than this
    remove(fname);
  }
}

2 ответа

Решение

rename() работает только на том же устройстве, просто меняет имя (или "перемещает" имя в другой каталог). rename() не может переместить данные файла из одного места в другое.

Если вы хотите скопировать или переместить файл, вам нужно сделать это самостоятельно:

  • открыть исходный и целевой файл
  • read () из исходного файла, запись в целевой файл в цикле до конца.
  • unlink () исходный файл (только если вы хотите переместить его.)

По всей вероятности, если вы запросите errno после неудачного переименования, вы обнаружите, что для него установлено значение EXDEV.

Могу ли я предложить вам добавить эту информацию или подтвердить, что это EXDEV.

Если вы получаете EXDEV, то из-за ограничения Linux rename() работает только в том случае, если oldpath и newpath находятся в одной и той же смонтированной файловой системе.

От переименования (2)

   EXDEV  oldpath and newpath are not on the  same  mounted  file  system.
          (Linux  permits  a file system to be mounted at multiple points,
          but rename() does not work across different mount  points,  even
          if the same file system is mounted on both.)
Другие вопросы по тегам