R file.mtime()在Mac OS和Windows 7上的精度极差

时间:2017-02-09 02:26:18

标签: r timestamp filemtime

在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中的精确文件时间戳?

2 个答案:

答案 0 :(得分:6)

您可以等待大约2周,此时R 3.3.3将解决此问题(至少对于Windows而言)。来自NEWS文件:

  

(仅限Windows。)file.info()现在返回文件时间戳,包括秒数;自R 2.14.0起,它已在其他平台上完成。 (注意:某些文件系统不记录修改和访问时间戳到亚秒级分辨率。)

答案 1 :(得分:3)

我认为新的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,我假设&#34;已修改&#34;是你最感兴趣的,但它很容易包含一些其他文件时间戳:

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的产品):( 1)stat确实不同,不支持相同命令行选项,因此需要更新此脚本; (2)this answer表明文件系统甚至不存储文件时间的亚秒级分辨率。如果您的文件系统类型是HFS +,我认为这里可能没有什么可做的。如果底层文件系统不同,您可能会有更好的结果。

Windows没有附带stat可执行文件。但是,在/Program Files/Git/usr/bin/stat.exe下,Git for Windows(有人认为是分析师/开发工具包中的必需品)。 (事实上​​,我上面的hack是在Windows上编写的,在Ubuntu上测试过第二次。)

不幸的是,根据您的文件系统类型,您可能无法获得MacOS上您想要/需要的内容。我无法让已安装的stat提供亚秒级分辨率(即使有不同的参数),这表明我引用的4年回答没有改变。