在R中下载文件时捕获FTP日志

时间:2017-09-19 11:31:07

标签: r ftp

我想通过ftp下载文件,还可以捕获ftp日志。我设法做到这一点:

options(internet.info = 0)  # displays the ftp log in the console

x <- capture.output(
  download.file("ftp://speedtest.tele2.net/1KB.zip", destfile = tempfile()),
  type = "message"
)

这将在控制台中显示ftp日志,并将一些download.file()输出捕获到变量x,但它不会捕获ftp日志。我也尝试了sink()的一些摆弄,但没有成功。

任何人都可以向我解释为什么这不起作用,有没有办法实现我想要的?我想处理一些ftp消息,所以简单地找回错误代码是不够的。

2 个答案:

答案 0 :(得分:1)

如果您使用的是Linux或Cygwin或Git bash,则可以将脚本的结果通过管道传输到文本文件中。如果将代码(没有输出捕获)放入名为script.R的文件中,则可以将所有输出传递给文本文件:

Rscript script.R &> script.txt

你可以在R中做这样的事情 - 但这让我觉得很邪恶:

uri <- "ftp://speedtest.tele2.net/1KB.zip"
destination <- tempfile()

system2("Rscript", 
        c("-e", 
          sprintf("\"options(internet.info = 0);download.file('%s', destfile = '%s', quiet = FALSE)\"", 
                  uri, 
                  destination)), 
        stderr = TRUE, stdout = TRUE)

答案 1 :(得分:1)

在sebastian-c和原始软件包作者的帮助下,我能够使用curl包为我的问题设计解决方案。我会在这里为后人保留它:

curl_download_with_log <- function(
  url,
  destfile
){
  log <- rawConnection(raw(), 'r+')
  on.exit(close(log))
  stopifnot(is.character(url))

  h <- curl::new_handle(
    debugfunction = function(type, data){
      if(type %in% c(0, 1, 2)){ 
        writeBin(data, log)
      }
    },
    verbose = TRUE
  )

  try({
    curl::curl_download(url, destfile = destfile, handle = h)
  })

  rawToChar(rawConnectionValue(log))
}

此函数将文件保存到destfile,并将日志作为字符向量返回。

解释:

  • debugfunction告诉libcurl如何处理调试数据。在这种情况下,将其写入二进制连接

  • if(type %in% c(0, 1, 2)){...}确保只将日志数据写入调试连接。如果不这样做,您下载的整个文件将与协议数据一起写入调试日志(有关不同调试级别的说明,请参阅link