В Windows 7 и Mac OS 10.12.2 (с R 3.3.2) появляется, что file.mtime()
сильно округляет или обрезает временные метки. Я подтвердил, что file.create("my_file.txt"); print(as.numeric(file.mtime("my_file.txt")), digits = 22)
выводит несколько цифр после десятичной дробной части в Linux, но все, что прошло после десятичной дроби, исчезает в Windows 7 для одного и того же my_file.txt
. Поведение для Mac OS 10.12.2 аналогично поведению Windows 7. Существует ли независимый от платформы способ получения точных временных меток файла в R?
R file.mtime() чрезвычайно низкая точность в Mac OS и Windows 7
Ответ 1
Я думаю, что новый file.info
, вероятно, лучший способ. Если R-3.3.3 не приносит то, что вам нужно (или в промежуточный период, если оно будет), вы можете попытаться выполнить его шаг за шагом, используя тот факт, что stat
, вероятно, установлен в базовой ОС (у меня есть не тестировался на Mac):
as.POSIXct(system2("stat", args = c("-c", "%y", "my_file.txt"), stdout = TRUE))
# [1] "2017-02-15 11:24:13 PST"
Это может быть формализовано в функции, которая больше для вас делает skosh:
my_mtime <- function(filenames, stat = c("modified", "birth", "access", "status"),
exe = Sys.which("stat")) {
if (! nzchar(exe)) stop("'stat' not found")
stat <- switch(match.arg(stat), birth = "%w", access = "%x", modified = "%y", status = "%z")
filenames <- Sys.glob(filenames) # expand wildcards, remove missing files
if (length(filenames)) {
outs <- setNames(system2(exe, args = c("-c", stat, shQuote(filenames)), stdout = TRUE),
nm = filenames)
as.POSIXct(outs)
}
}
my_mtime("[bh]*")
# b-file.R h-file.R
# "2017-02-14 05:46:34 PST" "2017-02-14 05:46:34 PST"
Поскольку вы запросили file.mtime
, я предполагаю, что "измененный" вам наиболее интересен, но достаточно легко включить некоторые другие временные метки файла:
my_mtime("[bh]*", stat="birth")
# b-file.R h-file.R
# "2017-02-13 22:04:01 PST" "2017-02-13 22:04:01 PST"
my_mtime("[bh]*", stat="status")
# b-file.R h-file.R
# "2017-02-14 05:46:34 PST" "2017-02-14 05:46:34 PST"
Обратите внимание, что отсутствие дробных секунд является артефактом печати (как вы сказали), это можно исправить:
x <- my_mtime("[bh]*", stat="status")
x
# b-file.R h-file.R
# "2017-02-14 05:46:34 PST" "2017-02-14 05:46:34 PST"
options(digits.secs = 6)
x
# b-file.R h-file.R
# "2017-02-14 05:46:34.307046 PST" "2017-02-14 05:46:34.313038 PST"
class(x)
# [1] "POSIXct" "POSIXt"
Обновление: после тестирования на Mac я подтвердил пару вещей (благодаря @HongOoi для prod): (1) stat
действительно отличается, не поддерживая ту же команду, line, поэтому этот script должен быть обновлен; и (2) этот ответ предполагает, что файловая система даже не сохраняет подсезонное разрешение на время файла. Если ваш тип файловой системы - HFS +, я думаю, здесь нечего делать. Если базовая файловая система отличается, у вас могут быть лучшие результаты.
Это правда, что Windows не поставляется с исполняемым файлом stat
. Однако Git для Windows (что некоторые утверждают, что это необходимо в аналитике /dev toolkit), в /Program Files/Git/usr/bin/stat.exe
. (На самом деле мой взлом выше был написан на Windows, второй проверен на Ubuntu.)
В итоге, к сожалению, вы не можете получить то, что хотите/нуждаетесь в MacOS, в зависимости от типа вашей файловой системы. Я не смог установить установленный stat
, чтобы дать подсевое разрешение (даже с его разными аргументами), предполагая, что ответ на 4 года, на который я ссылался, не изменился.
Ответ 2
Вы можете подождать около 2 недель, после чего R 3.3.3 решит эту проблему (по крайней мере для Windows). Из файла NEWS:
(только для Windows). file.info() теперь возвращает отметки времени файла, включая доли секунд; он сделал это на других платформах с R 2.14.0. (NB: некоторые файловые системы не записывают изменения и временные метки доступа к второму разрешению.)