【问题标题】:Comparing LastWriteTime and CreationTime比较 LastWriteTime 和 CreationTime
【发布时间】:2019-08-16 02:38:55
【问题描述】:

如果一个文件被创建和写入一次,我希望 LastWriteTime 与 CreationTime 相同。这段代码似乎说这不是真的。这些时间戳是否存储了更高的精度? ToString 和比较是唯一的方法吗?

PS 09:30  C:\src\t
>Get-ChildItem .\uu.txt | Select-Object -Property Name,LastWriteTime,CreationTime

Name   LastWriteTime       CreationTime
----   -------------       ------------
uu.txt 2019-08-09 09:23:25 2019-08-09 09:23:25


PS 09:30  C:\src\t
>Get-ChildItem .\uu.txt | ForEach-Object { $_.LastWriteTime -eq $_.CreationTime }
False

更新:

我最终得到了以下代码。如果 LastWriteTime 和 CreationTime 之间的差异小于一秒,则假定文件自创建以来未更新。

$CloseEnough = New-Timespan -Seconds 1
Get-ChildItem -File -Path 'C:\src\t' |
    Where-object { ($_.LastWriteTime - $_.CreationTime) -lt $CloseEnough }

【问题讨论】:

  • IMO 一定有区别,请检查 gi .\uu.txt| %{$_.LastWriteTime - $_.CreationTime} 对于重定向到文件的 gci,我得到 2 毫秒/27616 滴答声
  • @LotPings - 恰到好处。我得到 23 毫秒的差异。请将此作为答案,我会标记它。谢谢。

标签: powershell


【解决方案1】:

即使写入文件也需要一些时间,因此必须有所不同。

检查:

> Get-Item .\uu.txt | ForEach-Object { $_.LastWriteTime - $_.CreationTime}

Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 0
Milliseconds      : 2
Ticks             : 27616
TotalDays         : 3,1962962962963E-08
TotalHours        : 7,67111111111111E-07
TotalMinutes      : 4,60266666666667E-05
TotalSeconds      : 0,0027616
TotalMilliseconds : 2,7616

奇怪的是,上述时间是在 Mac 主机上的 VirtualBox VM 中的 Win10pro 中测量到的,写入 Gbit 网络 FreeNAS 共享。

本地 Win10 电脑写入本地 RamDisk/SSD 的速度要慢得多。

【讨论】:

    【解决方案2】:

    在 Windows 中 - CreationTime 是在磁盘分区上创建文件的时间,LastWriteTime 是更新文件内容的时间。

    所以在创建文件时,LastWriteTime 是写入完成的时间,而创建时间是创建文件的时间。他们不一样。您可以通过测量写入时间来检查,这将与 LastWriteTime 和 CreationTime 之间的差异大致相同:

    $str = 1..10000 | % { "$_`n" } # list of values to write
    Measure-Command { $str | Out-File test.txt }
    Get-Item test.txt | % { New-TimeSpan $_.CreationTime $_.LastWriteTime }
    

    但是,如果您将文件移动到计算机上的不同分区/磁盘,CreationTime 将更新,但由于内容没有更改,LastWriteTime 不会。因此,您最终会遇到您的 CreationTime 晚于您的 LastWriteTime 的情况。检查:

    Copy-Item c:\test.txt d:\test.txt
    Get-Item c:\test.txt, d:\test.txt | select FullName, CreationTime, LastWriteTime
    

    您的 LastWriteTime 将保持不变,但 CreationTime 会改变。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2019-12-18
      • 2014-06-12
      • 2011-04-20
      相关资源
      最近更新 更多