2017-02-09 45 views
17

在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上打印了小数点后的几位数字,但是在小数点后的所有内容都在相同的my_file.txt上消失。 Mac OS 10.12.2的行为与Windows 7的行为类似。有没有一种平台无关的方式来获取R中精确的文件时间戳?[R file.mtime()在Mac OS和Windows 7

回答

3

我认为新的file.info可能是最好的方法。如果R-3.3.3并没有带来你所需要的(或在此期间,若会),你可以尝试通过资本对stat很可能安装在基本操作系统中的事实侧步(我没有测试在Mac):

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,我假设“修饰”是最:

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

这可以在一个功能,做了skosh更适合你正规化有趣的给你,但它是很容易包括其他一些文件时间戳:

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(有些人认为这是分析师/开发工具包中的必需品)。 (实际上,我的黑客攻击是在Windows上编写的,在Ubuntu上进行了第二次测试。)

不幸的是,根据您的文件系统类型,您可能无法获得MacOS上的所需内容。我无法让安装的stat提供亚秒级的解决方案(即使有不同的论点),这表明我引用的4年前答案没有改变。

+0

stat是一个Unix/Linux实用程序,不在Windows上。在Mac上,文件系统本身只存储1秒分辨率的时间(直到APFS到达)。这基本上不会比R的'file.info'做更多的事情。 –

+0

请注意,Visual Studio内置了git集成,所以您甚至不需要独立的git安装。 –

+0

我不知道,谢谢。 VS是否带有像'stat'这样的其他unix-y可执行文件? (没想过要检查VS,因为它不在问题中,也许OP可以使用这个。) – r2evans

6

您可以等待2周左右,在这点R 3.3.3会解决这个问题(至少适用于Windows)。从NEWS文件:

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

+0

整洁!这对Windows非常有用。我可能是出于运气[的Mac OS(http://stackoverflow.com/questions/18403588/how-to-return-millisecond-information-for-file-access-on-mac-os-x-in但是, – landau