2017-02-09 51 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