2016-09-15 1 views
0

Ich versuche gerade, Dateien über FTP (mit R) herunterzuladen, aber ich möchte den Quell-Zeitstempel (Datum der letzten Änderung) behalten.Wie heruntergeladene Datei (von FTP) Zeitstempel mit R?

Ich weiß, dass download.file (von {base} R) kann mit einigen Extras verwendet werden und ich sah im Internet, dass -R oder --remote-time sollte den Trick tun. Aber der Code, den ich geschrieben habe, behält das Änderungsdatum als das Datum (und die Zeit) des Downloads bei.

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") 

Fehle ich hier etwas?

Ich habe es auch auf anderen FTP-Servern ohne Erfolg versucht.

Weitere Details: RStudio v0.99.484, R v3.3.1 (x64), das Betriebssystem Windows 7 Enterprise SP1

+0

versuchen 'method =" curl "' vs 'methode =" libcurl "' – hrbrmstr

+0

@hrbrmstr Wechseln zu 'method =" curl "' trows zwei Fehler: ** Fehler 127 ** und ** Download ungleich Null Ausgangsstatus ** –

+0

Ich denke, das bedeutet, dass die 'curl'-Binärdatei nicht auf dem System' PATH' liegt, was nicht überraschend ist, da es Windows ist und es unwahrscheinlich ist, dass es installiert ist. – hrbrmstr

Antwort

0

UPDATE

Ich wusste, dass dies in gebaut werden musste und fand es von der getrennt utils::file.… Operationen den ganzen Weg über in den base::Sys… Operationen:

Sys.setFileTime(path, time) 

¯\_(ツ)_/¯

Obwohl, warum dies nicht erweitert wurde, um die Einstellung von actime (Zugriffszeit) und modtime (Modifikationszeit) getrennt zu ermöglichen, ist es mir ein Rätsel. Zugriff bedeutet explizit das letzte Mal, wenn der Inhalt einer Datei untersucht wurde. Änderung bedeutet die Zeit, den Inhalt einer Datei geändert wurde (und es gibt POSIX-Regeln für das, was von einem sys Anruf Perspektive bildet jeder.

ich fühlte sich gezwungen, die Antwort mit mehr die autoritative Lösung zu aktualisieren (obwohl Mine mehr im Geist der POSIX-Definitionen trotz utimensat nicht verwenden -., die auf den meisten Systemen nicht verfügbar ist) Denken Sie daran, dass mit der integrierten Lösung, sind Sie sowohl der Zugang clobbering und ändern vs nur ändern


.

Ich konnte diese Seite nicht laden und ich denke, dass Ihr Problem mit der Umstellung auf curl vongelöst wurde in , aber dies ist eine generische Lösung (getestet auf macOS & Windows), die ich mit einer funktionierenden FTP-Site getestet:

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()))) 

Es würde einige zusätzliche Kontrolle und die Ausnahmebehandlung in einem Paket benötigen, aber diese shld funktioniert gut in einem Skript.

HINWEIS, dass Sie entweder einen vollständigen Pfad oder einen zugreifbaren relativen Arbeitsweg verwenden müssen (das mag offensichtlich sein, aber ich wollte sicherstellen, dass es erklärt wurde).

+0

Funktioniert wie ein Charme. Hervorragende Lösung, vielen Dank! –