如何在不使用R读取整个文件的情况下确定远程下载的文件大小

时间:2014-01-04 13:25:40

标签: r

在没有下载整个文件的情况下,是否有一种相当直接的方法来确定远程文件的文件大小? Stack Overflow回答了如何执行此操作with PHP and curl,所以我想在R中也可以这样做。如果可能的话,我认为最好避免RCurl,因为这需要为非Windows用户额外安装?

this survey analysis website上,我写了很多脚本来自动下载政府机构(如美国人口普查局和cdc)的大数据文件。我正在尝试通过创建“下载缓存”来实现一个下载已经下载的文件的附加组件 - 但我担心这个“下载缓存”可能会在以下情况下被破坏: 1)主机网站更改文件或2)用户在中途取消下载。因此,在决定是从源HTTP或FTP站点下载文件时,我想将本地文件大小与远程文件大小进行比较..如果它们不相同,请再次下载该文件。

2 个答案:

答案 0 :(得分:6)

如今,一种直截了当的方法可能是

response = httr::HEAD(url)
httr::headers(response)[["Content-Length"]]

我原来的答案是:更“手动”的方法是设置CURLOPT_NOBODY option(请参阅Linux上的man curl_easy_setopt,基本上是通过查看链接问题的答案来启发)并告诉{{ 1}}和朋友一起返回标题和请求

getURL

library(RCurl) url = "http://stackoverflow.com/questions/20921593/how-to-determine-the-file-size-of-a-remote-download-without-reading-the-entire-f" xx = getURL(url, nobody=1L, header=1L) strsplit(xx, "\r\n") ## [[1]] ## [1] "HTTP/1.1 200 OK" ## [2] "Cache-Control: public, max-age=60" ## [3] "Content-Length: 60848" ## [4] "Content-Type: text/html; charset=utf-8" ## [5] "Expires: Sat, 04 Jan 2014 14:09:58 GMT" ## [6] "Last-Modified: Sat, 04 Jan 2014 14:08:58 GMT" ## [7] "Vary: *" ## [8] "X-Frame-Options: SAMEORIGIN" ## [9] "Date: Sat, 04 Jan 2014 14:08:57 GMT" ## [10] "" 处的峰值建议url.exists解析HTTP标头。 parseHTTPHeader(xx)也适用于ftp网址。

getURL

答案 1 :(得分:5)

url <- "http://cdn.meclabs.com/training/misc/2013_Marketing_Analytics_BMR-StrongView.pdf"
library(RCurl)
res <- url.exists(url, .header=TRUE)
as.numeric(res['Content-Length']) 
# [1] 42413630
## bytes