【问题标题】:Obtain the last modified date of a file with MILLISECONDS?使用 MILLISECONDS 获取文件的最后修改日期?
【发布时间】:2018-09-13 22:19:34
【问题描述】:

我正在尝试从文件夹中获取某些文件的日期和时间(上次修改)。我设法获得了日期和小时/分钟/秒,但我无法获得 毫秒

我已经尝试以所有可能的方式格式化列。我只得到0 毫秒。

到目前为止我的代码是这样的:

  • 用户选择文件夹

  • 代码在 A 列中显示找到的所有文件名,在 B 列中显示日期、小时、分钟和秒(上次修改日期/时间)

我应该对当前代码做些什么来获得毫秒?

这是我的代码:

Private Function GetAllFiles(ByVal strPath As String, _
    ByVal intRow As Integer, ByRef objFSO As Object) As Integer
    Dim objFolder As Object
    Dim objFile As Object
    Dim i As Integer
    i = intRow - ROW_FIRST + 1
    Set objFolder = objFSO.GetFolder(strPath)
    For Each objFile In objFolder.Files
        'print file name
        Cells(i + ROW_FIRST + 2, 1) = objFile.Name
        'print file path
        Cells(i + ROW_FIRST + 2, 2) = objFile.DateLastModified
        i = i + 1
    Next objFile
    GetAllFiles = i + ROW_FIRST - 1
End Function

【问题讨论】:

  • 你的文件系统是 FAT 还是 NTFS?
  • NTFS,Windows 7,64 位
  • 很好,我也是。我会整理一个答案......但我可以先问一下,你打算用这个做什么,为什么你需要这种粒度级别? (另外,VBA 的 Date 类型只有 1 秒的分辨率,所以它必须使用不同的数据类型。)你将如何使用它可能会影响答案。
  • 简而言之,它是关于对扫描或拆分的文档 (pdf) 进行排序。我已经做了重命名代码和所有。问题是当我将 pdf 分成 100 页时,它将是“part 1 2 3 4 5”等等。 Vba 获取最后修改的日期,并在它之后排序。只有当它们具有相同的“创建”时间和秒数时,它们才能正确排序。所以我需要毫秒(资源管理器对它们进行正确排序)。我想找到其他解决方案(从第 1 2 3 部分中提取数字),但此代码将从扫描仪等中对其他类型的 pdf 进行排序,并显示毫秒将是完美的。
  • 我的英语远非完美。因此,vba 读取文件夹内容。在excel中获取文件夹中文件的最后修改日期。在日期 hh,mm,ss 之后对它们进行排序。从那时起,另一块 vba 接管从另一个表中为这些文件插入“新名称”。新名称已按扫描文档的顺序或它们在拆分的 pdf 中的显示方式排列。顺序必须匹配。

标签: vba excel milliseconds filetime


【解决方案1】:

以下模块将使用 Windows API 调用检索 Windows 文件创建、修改或访问的日期时间(包括毫秒)。

但必须注意,存在许多潜在问题。一个很大的问题是 VBA Date 数据类型的分辨率为 1 秒,因此需要将日期时间作为字符串返回,或者以不同的数据类型存储(Currency 是正确的大小。)

Option Explicit

Declare Function GetFileTime Lib "kernel32.dll" (ByVal hFile As Long, _
    lpCreationTime As FILETIME, lpLastAccessTime As FILETIME, _
    lpLastWriteTime As FILETIME) As Long

Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" _
    (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, _
    ByVal dwShareMode As Long, lpSecurityAttributes As Any, _
    ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, _
    ByVal hTemplateFile As Long) As Long

Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Declare Function FileTimeToSystemTime Lib "kernel32.dll" _
    (lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME) As Long

Type FILETIME
dwLowDateTime As Long
dwHighDateTime As Long
End Type

Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
End Type


Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const CREATE_ALWAYS = 2
Const CREATE_NEW = 1
Const OPEN_ALWAYS = 4
Const OPEN_EXISTING = 3
Const TRUNCATE_EXISTING = 5
Const FILE_ATTRIBUTE_ARCHIVE = &H20
Const FILE_ATTRIBUTE_HIDDEN = &H2
Const FILE_ATTRIBUTE_NORMAL = &H80
Const FILE_ATTRIBUTE_READONLY = &H1
Const FILE_ATTRIBUTE_SYSTEM = &H4
Const FILE_FLAG_DELETE_ON_CLOSE = &H4000000
Const FILE_FLAG_NO_BUFFERING = &H20000000
Const FILE_FLAG_OVERLAPPED = &H40000000
Const FILE_FLAG_POSIX_SEMANTICS = &H1000000
Const FILE_FLAG_RANDOM_ACCESS = &H10000000
Const FILE_FLAG_SEQUENTIAL_SCAN = &H8000000
Const FILE_FLAG_WRITE_THROUGH = &H80000000

Function GetDateValue(fName As String) As String
'returns UTC (GMT) file time for specified file

    Dim hFile As Long ' handle to the opened file
    Dim ctime As FILETIME ' receives time of creation
    Dim atime As FILETIME ' receives time of last access
    Dim mtime As FILETIME ' receives time of last modification
    Dim Thetime As SYSTEMTIME ' used to manipulate the time
    Dim retval As Long ' return value

    hFile = CreateFile(fName, GENERIC_READ, FILE_SHARE_READ, _
        ByVal CLng(0), OPEN_EXISTING, FILE_ATTRIBUTE_ARCHIVE, 0)

    retval = GetFileTime(hFile, ctime, atime, mtime)

    'Choose which date to return: creation, modify or access date
    'retval = FileTimeToSystemTime(ctime, Thetime) 'extract creation datetime
    retval = FileTimeToSystemTime(mtime, Thetime) 'extract modified datetime
    'retval = FileTimeToSystemTime(atime, Thetime) 'extract accessed datetime

    retval = CloseHandle(hFile)

    With Thetime
        GetDateValue = .wYear & Format(.wMonth, "\-00") & _
            Format(.wDay, "\-00") & " " & Format(.wHour, "00") & _
            Format(.wMinute, "\:00") & Format(.wSecond, "\:00") & _
            Format(.wSecond, "\.000")
    End With
End Function

Sub test()
    MsgBox GetDateValue("c:\logfile.txt") 
    'returns a string like "2018-03-31 16:13:52.052"
End Sub

我只是将其粘贴在这里,它并不完美,但它可以工作并且可以根据您的个人需求进行调整。请注意,您需要手动取消注释您希望函数返回的哪个日期时间。

在将其用于任何重要的事情之前,请务必阅读,因为根据您的文件系统等存在限制。例如,NTFS 通常会在您“认为”文件完成后完成写入文件……最多 1 小时后。


更多信息:

【讨论】:

  • WSSeconds 用在应该是 wMiliseconds 的地方
猜你喜欢
  • 2019-02-26
  • 1970-01-01
  • 2010-09-17
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
相关资源
最近更新 更多