C - 如何将文件从cifs mount移动到本地hdd

时间:2013-08-14 17:49:08

标签: c linux smb cifs

当我尝试将文件从cifs挂载重命名为本地路径(将文件从服务器移动到本地hdd)时,我得到-1。我可以删除文件,我可以添加新文件,我只是不能使用rename()函数来做到这一点。该程序以root用户身份运行,cifs mount中的用户拥有该共享和服务器上本地文件系统的完全权限。

服务器: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 个答案:

答案 0 :(得分:7)

rename()仅适用于同一设备,它只是更改其名称(或将名称“移动”到另一个目录)。 rename()无法将文件数据从一个位置移动到另一个位置。

如果您想复制或移动文件,您需要自己动手:

  • 打开源文件和目标文件
  • 从源文件中读取(),在循环中写入目标文件,直到结束。
  • unlink()源文件(仅当您要移动它时。)

答案 1 :(得分:3)

很有可能,如果在重命名失败后询问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.)