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.)