2016-09-15 2 views
0

В настоящее время я пытаюсь загрузить файлы через FTP (с R), но я хочу сохранить исходную временную метку (последняя измененная дата).Как сохранить загруженный файл (с FTP) timestamp с помощью 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), операционная система Windows 7 Enterprise SP1

+0

try 'method =" curl "' vs 'method =" libcurl "' – hrbrmstr

+0

@hrbrmstr Переход к 'method =" curl "'вызывает две ошибки: ** ошибка 127 ** и ** загрузка отличного от нуля статуса выхода ** –

+0

Я думаю, это означает, что двоичный файл 'curl' не находится в системе' PATH', что неудивительно, так как это Windows и вряд ли будет установлено. – hrbrmstr

ответ

0

UPDATE

Я знал, что это должно было быть построено в и нашел, что это отделено от utils::file.… операции все пути в base::Sys… операций:

Sys.setFileTime(path, time) 

¯\_(ツ)_/¯

Хотя, почему это не было расширено, чтобы включить настройку actime (время доступа) и modtime (время модификации) отдельно вне меня. Доступ к явно означает, что последний раз содержимое файла было проверено. Модификация означает время содержимое файла было изменено (и есть POSIX правила для того, что представляет собой каждое с точки зрения SYS вызова.

я был вынужден обновить ответ с более авторитетным решением (хотя мое больше в духе определений POSIX, несмотря на не используя utimensat -., который не доступен на большинстве систем) Просто помните, что с помощью встроенного в растворе, вы затирания как доступ и изменять против просто изменить


.

Я не мог загрузить этот сайт, и я думаю, что ваша проблема решена с помощью переключателя 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 отлично работайте в скрипте.

Учтите, что вам необходимо использовать полный путь или доступный рабочий относительный путь (это может быть очевидным, но я хотел убедиться, что это было объяснено).

+0

Работает как очарование. Отличное решение, большое спасибо! –

Смежные вопросы