6

/tmp/RtmpK4k1Ju/oldnameディレクトリ全体を sayからに移動する最も堅牢な方法は何/home/jeroen/newnameですか? ただし、最も簡単な方法はfile.rename、たとえばfromtoが異なるディスク上にある場合など、これが常に機能するとは限りません。その場合、ディレクトリ全体を再帰的にコピーする必要があります。

これは私が思いついたものですが、少し複雑で、クロスプラットフォームで動作するかどうかはわかりません. より良い方法はありますか?

dir.move <- function(from, to){
  stopifnot(!file.exists(to));
  if(file.rename(from, to)){
    return(TRUE)
  }
  stopifnot(dir.create(to, recursive=TRUE));
  setwd(from)
  if(all(file.copy(list.files(all.files=TRUE, include.dirs=TRUE), to, recursive=TRUE))){
    #success!
    unlink(from, recursive=TRUE);
    return(TRUE)
  }
  #fail!
  unlink(to, recursive=TRUE);
  stop("Failed to move ", from, " to ", to);
}
4

2 に答える 2

3

file.copyで十分だと思います。

file.copy(from, to, overwrite = recursive, recursive = FALSE,
          copy.mode = TRUE)

から?file.copy:

from, to: character vectors, containing file names or paths.  For
         ‘file.copy’ and ‘file.symlink’ ‘to’ can alternatively
         be the path to a single existing directory.

と:

recursive: logical.  If ‘to’ is a directory, should directories in
          ‘from’ be copied (and their contents)?  (Like ‘cp -R’ on
          POSIX OSes.)

についての説明から、ディレクトリを持つことができることがrecursiveわかっfromています。したがって、上記のコードでは、コピー前にすべてのファイルをリストする必要はありません。toそして、ディレクトリがコピーされたの親になることを覚えておいてfromください。たとえば、 afterfile.copy("dir_a/", "new_dir/", recursive = T)にはdir_aunderがありnew_dirます。

あなたのコードは削除部分をかなりうまくやっています。unlink良いrecursiveオプションがありますが、そうではありfile.removeません。

unlink(x, recursive = FALSE, force = FALSE)
于 2013-07-30T18:41:05.257 に答える