使用 MILLISECONDS 获取文件的最后修改日期?
Obtain the last modified date of a file with MILLISECONDS?
我正在尝试从文件夹中获取某些文件的日期和时间(最后修改时间)。我设法获得了日期和 hour/minutes/seconds 但我无法获得 毫秒 .
我已经尝试过以所有可能的方式格式化列。我只得到 0
毫秒。
我的代码到目前为止:
用户选择文件夹
代码在 A 列中显示找到的所有文件名,在 B 列中显示日期、小时、分钟和秒(最后修改 date/time)
当前代码如何获取毫秒数?
这是我的代码:
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
以下模块将检索 Windows 文件创建、修改或访问的日期时间,包括毫秒,使用 Windows API 调用。
但是必须注意,存在许多潜在问题。一个很大的问题是 VBA Date
数据类型的分辨率为 1 秒,因此日期时间需要 returned 作为字符串,或者存储在不同的数据类型中( 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
我只是把它粘贴在这里,它并不完美,但它可以工作并且可以根据您的个人需求进行调整。请注意,您需要手动取消注释 which datetime 您希望函数 return.
在将它用于任何重要的事情之前请务必阅读,因为根据您的文件系统和其他因素,存在限制。例如,NTFS 通常会在您 "think" 完成后写入文件...最多 1 小时后。
更多信息:
VB 论坛:Code Source(注意作者在后面post中提到的错误)
MSDN:Windows File Times
MSDN:GetFileTime Function (Windows/C++)
堆栈溢出:
我正在尝试从文件夹中获取某些文件的日期和时间(最后修改时间)。我设法获得了日期和 hour/minutes/seconds 但我无法获得 毫秒 .
我已经尝试过以所有可能的方式格式化列。我只得到 0
毫秒。
我的代码到目前为止:
用户选择文件夹
代码在 A 列中显示找到的所有文件名,在 B 列中显示日期、小时、分钟和秒(最后修改 date/time)
当前代码如何获取毫秒数?
这是我的代码:
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
以下模块将检索 Windows 文件创建、修改或访问的日期时间,包括毫秒,使用 Windows API 调用。
但是必须注意,存在许多潜在问题。一个很大的问题是 VBA Date
数据类型的分辨率为 1 秒,因此日期时间需要 returned 作为字符串,或者存储在不同的数据类型中( 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
我只是把它粘贴在这里,它并不完美,但它可以工作并且可以根据您的个人需求进行调整。请注意,您需要手动取消注释 which datetime 您希望函数 return.
在将它用于任何重要的事情之前请务必阅读,因为根据您的文件系统和其他因素,存在限制。例如,NTFS 通常会在您 "think" 完成后写入文件...最多 1 小时后。
更多信息:
VB 论坛:Code Source(注意作者在后面post中提到的错误)
MSDN:Windows File Times
MSDN:GetFileTime Function (Windows/C++)
堆栈溢出: