如何检查Shell32.Folder.CopyHere()何时完成

7
我需要使用Shell32在我的应用程序中解压缩和压缩一些文件。目前,我使用 srcFolder.CopyHere(destFolder.Items()) 来实现此操作。但是,我的下一行代码需要新创建的ZIP文件。但由于 CopyHere 方法是异步的,我该如何检查它何时完成?目前,我使用 Thread.Sleep 大约500毫秒,这足以让我的电脑完成创建ZIP文件,但在我看来,这不是好的代码。有什么想法吗?如果需要,可以提供更多信息/代码。
2个回答

10

这里是另一个等待复制完成的例子

'Wait until the File/Folder has finished writing to zip file...
Do Until Shell.NameSpace(Filename).Items.Count = Shell.NameSpace(Input).Items.Count
    System.Threading.Thread.Sleep(200)
    System.Diagnostics.Debug.Print("Waiting...")
Loop

天才...应该是最佳答案。这种方式可能更有效,没有阻塞内核调用。 - Motomotes
这很不错。但是,您可能需要调整文件夹中任何现有项目的数量。 - k rey
这种方法有时仍会抛出错误。我们已经在项目中实施了这种方法,但在某些客户机器上会引发70或75号错误。 - sidnc86

6
我找到了,类似这样使用:

我找到了,使用类似以下代码:

  srcFolder.CopyHere(destFolder.Items())


            While FileInUse(FILEPATH & "BudgetJaarOverzichtSMB.zip")
                Thread.Sleep(100)
            End While

    Private Function FileInUse(ByVal FilePath As String) As Boolean
        Try
            FileOpen(1, FilePath, OpenMode.Input)
            FileClose(1)
            Return False    ' File not in use
        Catch ex As Exception
            Return True     ' File in use
        End Try
    End Function

虽然不完美,但是比我第一次尝试花费的时间少。


+1 尝试查找某些内容,但什么都没找到。只是一个提示。如果您的复制时间太长,请添加一些安全措施来中断该循环(例如不可用的网络路径)。 - Steve
这个解决方案在Windows 8上可以工作,但在Windows 7上会过早触发。有什么想法吗? - Dan Gifford
使用Excel VBA,我们需要:
  1. 将文本文件复制到zip文件中
  2. 获取zip文件的字节流以进行进一步处理。
  3. 删除文本和zip文件。
由于代码给出了不寻常和不规则的错误(始终与文件路径/zip文件路径有关),因此我们将1和3的代码提取到另一个测试环境中,并多次重新运行它。在这里,我们实现了FileInUse解决方案,但某种方式该函数始终返回false,删除操作根本没有执行。
- sidnc86

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接