2

我正在编写一个与 ScanSnap 扫描仪集成的程序。ScanSnap 扫描仪不支持 TWAIN。扫描文档后,它会自动保存为 PDF。

我想监视将保存文件的目录,并在文件出现(并完成写入)时采取一些措施。一种简单的方法是使用 MS Access 表单 Timer 事件并在某个小时间间隔检查现有文件。

通过 Windows 消息传递、FileSystemObject 或某些支持回调的 Windows API 函数是否有更好的选择?

4

4 回答 4

1

Excel里面什么都没有。

您可以创建另一个应用程序来监视文件系统并执行 Excel 宏,如果需要打开工作簿,如果需要打开 Excel。

于 2013-08-14T21:38:16.860 回答
1

@Steve 有效地回答了我提出的问题。我应该问的是如何在独立于 MS Access UI 线程的线程中监视文件系统更改。这个问题的简单答案是VBA不支持Office 应用程序中的多线程。

有多种解决方法通常涉及调用外部 COM 库或与外部应用程序集成。我认为这些都不是很吸引人,而是决定使用 FileSystemWatcher 类在 VB.Net 中实现该解决方案。

于 2013-09-02T19:13:35.660 回答
0

不确定这是否真的解决了您的问题,但这是一种使用 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)。该代码仅旨在为您提供可能解决您的问题的提示。

于 2015-11-11T10:49:26.927 回答