首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R file.mtime()在Mac和Windows 7上精度极低

R file.mtime()在Mac和Windows 7上精度极低
EN

Stack Overflow用户
提问于 2017-02-09 02:26:17
回答 2查看 1.3K关注 0票数 17

在Windows7和MacOS10.12.2(R3.3.2)上,file.mtime()似乎严重地循环或截断了时间戳。我验证了file.create("my_file.txt"); print(as.numeric(file.mtime("my_file.txt")), digits = 22)在Linux上打印了几个小数点以上的数字,但是对于同一个my_file.txt,超过十进制数的东西在Windows7上消失了。MacOS10.12.2的行为类似于Windows 7。有没有一种独立于平台的方法在R中获得精确的文件时间戳?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-02-15 21:49:11

我认为新的file.info可能是最好的选择。如果R-3.3.3没有带来您需要的东西(或者在过渡期间,如果需要的话),您可以利用stat很可能安装在基本操作系统(我还没有在Mac上进行测试)这一事实来绕过它:

代码语言:javascript
复制
as.POSIXct(system2("stat", args = c("-c", "%y", "my_file.txt"), stdout = TRUE))
# [1] "2017-02-15 11:24:13 PST"

这可以在一个为您做更多的skosh的函数中正式化:

代码语言:javascript
复制
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,我想“修改”是您最感兴趣的,但是很容易包含其他一些文件时间戳:

代码语言:javascript
复制
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" 

请注意,缺少小数秒是打印的一个工件(正如您所说的),这是可以补救的:

代码语言:javascript
复制
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" 

Update:在Mac上测试之后,我确认了几件事情(感谢@HongOoi ):(1) stat确实不同,不支持相同的命令行选项,因此需要更新这个脚本;(2) 这个答案建议文件系统甚至不会在文件时存储次秒分辨率。如果您的文件系统类型是HFS+,我认为这里可能没有什么可做的。如果底层文件系统不同,您可能会有更好的结果。

确实,Windows没有附带stat可执行文件。然而,用于Windows的Git (在分析师/开发工具包中是必需的)在/Program Files/Git/usr/bin/stat.exe下是必要的。(事实上,上面的黑客攻击是在Windows上编写的,在Ubuntu上进行了第二次测试。)

不幸的是,根据您的文件系统类型,您可能无法在MacOS上得到所需的内容。我无法让安装的stat给出次秒分辨率(即使它有不同的参数),这意味着我引用的4年前的答案没有改变。

票数 3
EN

Stack Overflow用户

发布于 2017-02-11 18:39:45

您可以等待大约两个星期,此时R3.3.3将解决这个问题(至少对于Windows来说是这样)。来自新闻文件:

(只有窗户。)file.info()现在返回文件时间戳,包括秒数;从R2.14.0开始,它就在其他平台上这样做了。(注意:一些文件系统不记录修改和访问秒级分辨率的时间戳。)

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42127185

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档