我正在编写一个与 ScanSnap 扫描仪集成的程序。ScanSnap 扫描仪不支持 TWAIN。扫描文档后,它会自动保存为 PDF。
我想监视将保存文件的目录,并在文件出现(并完成写入)时采取一些措施。一种简单的方法是使用 MS Access 表单 Timer 事件并在某个小时间间隔检查现有文件。
通过 Windows 消息传递、FileSystemObject 或某些支持回调的 Windows API 函数是否有更好的选择?
Excel里面什么都没有。
您可以创建另一个应用程序来监视文件系统并执行 Excel 宏,如果需要打开工作簿,如果需要打开 Excel。
这提供了一种本机 WinAP + VB/VBA 的工作方式,我期望:
@Steve 有效地回答了我提出的问题。我应该问的是如何在独立于 MS Access UI 线程的线程中监视文件系统更改。这个问题的简单答案是VBA不支持Office 应用程序中的多线程。
有多种解决方法通常涉及调用外部 COM 库或与外部应用程序集成。我认为这些都不是很吸引人,而是决定使用 FileSystemWatcher 类在 VB.Net 中实现该解决方案。
不确定这是否真的解决了您的问题,但这是一种使用 Excel VBA 的方法,它帮助我监视特定文件夹中的特定文件并在文件被修改和保存时执行某些操作(此处:将文件复制到另一个文件夹)(即当文件的时间戳改变时):
Option Explicit
Const SourcePath = "C:\YourFolder\"
Const TargetPath = "C:\YourFolder\YourFolder_Changes\"
Const TargetFile = "YourFileName"
Private m_blnLooping As Boolean
Private Sub CommandButton1_Click()
Dim FSO As Scripting.FileSystemObject
Dim n, msg, dt, inttext As String
Dim file, files As Object
Dim d1, d2 As Date
Dim cnt As Integer
Dim wsshell
Application.ScreenUpdating = False
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
Set files = FSO.GetFolder(SourcePath).files
Set wsshell = CreateObject("WScript.Shell")
msg = "FileWatcher started. Monitoring of " & TargetFile & " in progress."
cnt = 0
'Initialize: Loop through Folder content and get file date
For Each file In files
n = file.name
'Get Initial SaveDate of Target File
If n = TargetFile Then
d1 = file.DateLastModified
End If
Next file
m_blnLooping = True
inttext = wsshell.popup(msg, 2, "FileWatcher Ready", vbInformation)
'Message Box should close after 2 seconds automatically
Shell "C:\WINDOWS\explorer.exe """ & TargetPath & "", vbNormalFocus
'Open Windows Explorer and display Target Directory to see changes
Do While m_blnLooping
For Each file In files
n = file.name
If n = TargetFile Then
d2 = file.DateLastModified
If d2 > d1 Then
dt = Format(CStr(Now), "yyyy-mm-dd_hh-mm-ss")
'FSO.CopyFile (SourcePath & TargetFile), (TargetPath & Left(TargetFile, Len(TargetFile) - 4) & "_" & dt & ".txt"), True 'Option with file name extension
FSO.CopyFile (SourcePath & TargetFile), (TargetPath & TargetFile & "_" & dt), True 'Option without file name extension
cnt = cnt + 1
d1 = d2
End If
End If
Next file
'Application.Wait (Now() + CDate("00:00:02")) 'wait 2 seconds, then loop again
DoEvents
Loop
msg = "File " & TargetFile & " has been updated " & cnt & " times."
inttext = wsshell.popup(msg, 2, "FileWatcher Closed", vbInformation)
'Message Box should close after 2 seconds automatically
Application.ScreenUpdating = True
End Sub
Private Sub CommandButton2_Click()
m_blnLooping = False
End Sub
该过程通过命令按钮(“开始”)激活并循环通过指定的文件夹(继续查看文件),直到按下另一个命令按钮(“停止”)。但是,您可能需要调整代码以监视文件创建而不是文件更改(file.DateCreated 而不是 file.DateLastModified)。该代码仅旨在为您提供可能解决您的问题的提示。