我目前正在尝试通过FTP下载文件(使用R),但我想保留源时间戳(上次修改日期)。
我知道download.file(来自{base} R)可以与一些额外内容一起使用,我在网上看到-R
或--remote-time
应该做的伎俩。但是我编写的代码确实将修改日期保留为下载的日期(和时间)。
download.file(url = "ftp://ftp.datasus.gov.br/dissemin/publicos/SIASUS/200801_/Dados/ABAC1502.dbc",
destfile = "C:/LocalPath/ABAC1502.dbc",
quiet = T,
mode = 'wb',
method = "libcurl",
extra = "--remote-time")
我在这里错过了什么吗?
我也在其他FTP服务器上试过但没有成功。
更多详情:RStudio v0.99.484,R v3.3.1(x64),OS Windows 7 Enterprise SP1
答案 0 :(得分:0)
<强>更新强>
我知道必须将其内置并在utils::file.…
操作中将其与base::Sys…
操作分开:
Sys.setFileTime(path, time)
¯\_(ツ)_/¯
尽管如此,为什么还没有扩展到能够单独设置actime
(访问时间)和modtime
(修改时间),这已经超出了我的范围。 Access 明确表示上次检查文件内容的时间。 修改表示文件内容更改的时间(从sys调用角度来看,每个文件的构成都有POSIX规则。
我觉得有必要用更多的权威解决方案来更新答案(尽管我没有使用utimensat
,但更多地遵循POSIX定义的精神 - 这在大多数系统中都不可用)。请记住,使用内置解决方案,您可以破坏访问和修改,而不仅仅是修改。
我无法加载该网站,我认为通过curl
中的libcurl
切换到extra
可以解决您的问题,但这是一个更通用的解决方案(在macOS和Windows上测试)我使用已知的工作FTP站点进行测试:
library(curl)
library(Rcpp)
library(inline)
h <- new_handle()
handle_setopt(h, filetime=TRUE, verbose=TRUE) # verbose is just for my debugging
h <- curl_fetch_disk("ftp://ftp.ngdc.noaa.gov/STP/SOLAR_DATA/AIRGLOW/IGYDATA/abst5270",
"abst5270", h)
h$modified
## [1] "1999-10-22 18:59:10 EDT"
as.numeric(h$modified)
## [1] 940633150
set_modtime <- rcpp(sig=c(path="character", ts="integer"), body=
" struct stat f_stat;
struct utimbuf ftp_time;
std::string file_path = as<std::string>(path);
long file_ts = as<long>(ts);
if (stat(file_path.c_str(), &f_stat) >= 0) {
ftp_time.actime = f_stat.st_atime;
ftp_time.modtime = file_ts;
utime(file_path.c_str(), &ftp_time);
}
", includes=c("#include <time.h>", "#include <utime.h>", "#include <sys/stat.h>"))
# Changes it to way back in the past
invisible(set_modtime("abst5270", as.numeric(h$modified)))
# Changes it back to right now
invisible(set_modtime("abst5270", as.numeric(Sys.time())))
它需要在包中进行一些额外的检查和异常处理,但是这个shld在脚本中工作正常。
请注意,您必须使用完整路径或可访问的工作相对路径(这可能很明显,但我想确保对其进行解释)。
答案 1 :(得分:0)
在旁注中,检查http://github.com/ajdamico/lodown/中的数据函数。它可能很有用。