我一直在研究这个问题,但是我找到的答案是针对C#的,而不是针对F#的。看来我需要使用DateTime.Compare
,但我希望有一个本机解决方案。
此功能的目的(以下)是确定一个文件的访问时间是否大于等于阈值。阈值是最后访问时间,从最后访问时间中减去天数。
days_old
与文件名isFileStale
一起传递到函数fn
中。
我对此功能为何总是返回false
感到困惑。
let isFileStale fn days_old =
let rc =
let currentTime = ((System.DateTime.Now).ToLocalTime())
let lastFileUsed = File.GetLastAccessTime(fn)
let timeSpan = new TimeSpan(days_old, 0, 0, 0, 0)
let fileDeleteThreshhold = lastFileUsed.Subtract(timeSpan)
if fileDeleteThreshhold >= lastFileUsed then
true
else
false
rc
答案 0 :(得分:5)
我不确定您要做什么,但您总是会出错,因为lastFileUsed.Subtract(timeSpan)
(即您的fileDeleteThreshhold
值)将始终低于lastFileUsed
(或当days_old = 0时等于)
也许这就是您想要的:
let isFileStale fn days_old =
let currentTime = DateTime.Now
let lastFileUsed = File.GetLastAccessTime(fn)
(currentTime - lastFileUsed).Days >= days_old
答案 1 :(得分:1)
顺便说一句,顺便说一句,只要您在函数中使用DateTime.Now
,我建议您将currentTime
移到 pure 函数中参数。这使您的单元测试变得更加简单,因为您不必模拟DateTime.Now
,只需要传递您希望成为该单元测试“当前”时间的时间即可。例如,要使用当前功能测试isFileStale
,您的单元测试将必须检查当前时间,创建一个时间戳为(当前时间-N天)的文件,然后对该文件调用isFileStale
。但是使用isFileStale
作为参数的currentTime
版本,您的测试将是:
这也使您可以轻松地进行2月29日之类的测试,而无需每隔四年在正确的时间精确地运行单元测试。
现在,对于像isFileStale
这样的简单功能,可能没有必要。但是要记住,这是一个很好的经验法则。我建议编写以下 pair 函数(从gileCAD的代码开始,因为它非常出色):
let isFileStale currentTime days_old fn =
let lastFileUsed = File.GetLastAccessTime(fn)
(currentTime - lastFileUsed).Days >= days_old
let isFileOlderThanNDays days_old fn =
isFileStale DateTime.Now days_old fn
请注意,我交换了days_old
和fn
参数的顺序,因为这使您可以编写在管道中有意义的代码:
if "/path/to/file" |> isFileOlderThanNDays 7 then
printfn "File is at least a week old"
else
printfn "File is relatively fresh"