2017-09-19 5 views
1

ftp経由でファイルをダウンロードし、ftpログを取得したい。私はこれまでのところ得ることをどうにか:ファイルをダウンロードするときにFTPログをキャプチャするR

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ログを表示し、変数xにいくつかのdownload.file()出力をキャプチャし、それはFTPログをキャプチャしません。私もsink()で回ってみましたが、成功しませんでした。

誰も私にこれがなぜ機能しないのか説明することはできますか?そして、私が欲しいものを達成する方法はありますか?私はいくつかのftpメッセージを処理したいので、単にエラーコードを返すだけでは十分ではありません。

+0

あなたは、Linuxを使用して、または同様のシェルへのアクセス権を持っていますGit Bashなど? –

+1

私は 'curl'パッケージの作成者にあなたの質問をしました。そして、接続からデバッグ情報を得るための方法[https://github.com/jeroen/curl/issues/120#issuecomment-330580210]があります。しかし、あなたのzipファイルは構造上非常に珍しく、これはいくつかの問題を引き起こしています。 –

答えて

1

。私は後世のためにここでそれを維持しようとするでしょう:

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を参照)

1

LinuxまたはCygwinまたはGit bashを使用している場合は、スクリプトの結果をテキストファイルにパイプすることができます。あなたが呼ばれるファイルに(出力キャプチャなし)あなたのコードを入れた場合script.Rすることができますパイプテキストファイルにすべての出力:

Rscript script.R &> script.txt 

あなたはR内でこのような何かを行うことができます - しかし、それは私に悪感じています:セバスチャン-Cの助けを借りて、私はcurlパッケージと私の問題の解決策を考案することができたオリジナルパッケージの作者で

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) 
+0

解決策が私を助けないように、プロセス(潜在的)エラーコードの関数でダウンロードをラップしたいと思います。/ –

+1

ああ、残念です。私は前にこのような問題があったし、それらのメッセージを得ることは自明ではない。あなたは 'curl'のような別のパッケージを使ってファイルをダウンロードすることを検討しましたか?そこでは、より良いエラー処理があるかもしれません。 –

+0

私はカールを試みましたが、それを行う方法も見つけられませんでした(それは存在しないということではありません)。 –

関連する問題