2017-09-19 1 views
1

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 로그를 표시하고 변수 x 일부 download.file() 출력을 캡처하지만 FTP 로그를 캡처하지 않습니다 나는 여기까지 얻을 수 있었다. 나는 또한 sink()으로 주변을 둘러 보았지만 성공하지 못했습니다.

아무에게도 이것이 왜 작동하지 않는지 설명 할 수 있습니까? 그리고 내가 원하는 것을 성취 할 수있는 방법이 있습니까? 나는 오류 코드를 되 찾는 것만으로는 충분하지 않을 수도 있기 때문에 일부 FTP 메시지를 처리하려고한다.

+0

당신이 리눅스를 사용 또는 유사한 쉘에 액세스 할 수 있습니까 (다른 디버그 수준의 explaination에 대한 link 참조) 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에 파일을 저장하며, 문자 벡터로 로그를 반환 : 나는 후대를 위해 여기를 유지하려고합니다.

Explaination는 :

  • debugfunction

    디버깅 데이터로 무엇을해야하는지 libcurl에 알려줍니다. 이 경우 바이너리 연결로 작성하십시오.

  • if(type %in% c(0, 1, 2)){...} 로그 데이터 만 디버그 연결에 기록되도록하십시오. 당신이 떠날 경우, 다운로드 파일 전체가 프로토콜 데이터와 함께 디버그 로그에 기록됩니다

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

나는 말리려고했으나 그것을 할 수있는 방법을 찾지 못했습니다 (그것이 존재하지 않는다는 것을 의미하지는 않습니다). –

관련 문제