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

Ant*_*ico 6 r

是否有一种相当直接的方法来确定远程文件的文件大小而不下载整个文件?Stack Overflow回答了如何用PHP和curl做到这一点,所以我想在R中也可以.如果可能,我认为最好避免RCurl,因为这需要为非Windows用户额外安装?

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

Mar*_*gan 6

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

response = httr::HEAD(url)
httr::headers(response)[["Content-Length"]]
Run Code Online (Sandbox Code Playgroud)

我的原始答案是:更"手动"的方法是设置CURLOPT_NOBODY选项(参见man curl_easy_setoptLinux,基本上是通过查看链接问题的答案来启发)并告诉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] ""                                            
Run Code Online (Sandbox Code Playgroud)

url.exists建议parseHTTPHeader(xx)用于解析HTTP标头的峰值.getURL也适用于ftp URL.

url = "ftp://ftp2.census.gov/AHS/AHS_2004/AHS_2004_Metro_PUF_Flat.zip"
getURL(url, nobody=1L, header=1L)
## [1] "Content-Length: 21288307\r\nAccept-ranges: bytes\r\n"
Run Code Online (Sandbox Code Playgroud)


luk*_*keA 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
Run Code Online (Sandbox Code Playgroud)