1

ファイルの名前を CIFS マウントからローカル パスに変更しようとすると (ファイルをサーバーからローカル HDD に移動する)、-1 が返されます。ファイルを削除したり、新しいファイルを追加したりできますが、rename() 関数を使用してそれを行うことはできません。プログラムは root として実行されており、cifs マウントのユーザーはサーバー上の共有とローカル ファイルシステムに対する完全な権限を持っています。

サーバー: Windows XP SP3 x32

ローカル: Ubuntu 13.04 x64

smb マウント:

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);
  }
}
4

2 に答える 2

7

rename() は同じデバイスでのみ機能し、名前を変更する (または名前を別のディレクトリに「移動」する) だけです。rename() は、ファイル データをある場所から別の場所に移動することはできません。

ファイルをコピーまたは移動する場合は、自分で行う必要があります。

  • ソース ファイルと宛先ファイルを開く
  • ソースファイルから read() を実行し、最後までループして宛先ファイルに書き込みます。
  • unlink() ソース ファイル (移動する場合のみ)。
于 2013-08-14T18:00:51.507 に答える
3

ほとんどの場合、rename が失敗した後に errno を調べると、EXDEV に設定されていることがわかります。

その情報を追加するか、EXDEV であることを確認することをお勧めします。

EXDEV を取得している場合は、oldpath と newpath が同じマウントされたファイル システム上にある場合にのみ rename() が機能するという Linux の制限が原因です。

rename(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.)
于 2013-08-14T17:55:00.107 に答える