如何在 VB.Net 中使用单个 windows 复制 GUI 复制多个 files/folders

How to copy multiple files/folders using single windows copy GUI in VB.Net

我正在 VB.Net 中制作一个应用程序,它将许多文件和文件夹复制到同一目录,我希望为此使用 windows 资源管理器(因此用户有 GUI 而我没有担心显示任何错误或比较文件)。

所以,如果我对每个都这样做 file/folder:

My.Computer.FileSystem.CopyDirectory(source_path, target_path, FileIO.UIOption.AllDialogs)
My.Computer.FileSystem.CopyFile(source_path, target_path, FileIO.UIOption.AllDialogs)

它工作正常并显示这个 window:

这很好,但是,如果我有很多文件 and/or 文件夹并且我遍历它们并调用上面的命令,它们会为每个 file/folder 启动一个新副本 window,而不是像这样启动一个将它们组合在一起的单一 GUI:

是否可以将多个 files/folders 复制过程合并为一个 windows 资源管理器副本 window GUI?

感谢@Jimi,我得到了 SHFileOperations 的指导,所以我想出了如何做到这一点。我做了一个小 class 来做这个:

Imports System.Runtime.InteropServices

Public Class NativeCopy
    
    Private Enum FO_Func As Short
        FO_COPY   = &H2
        FO_DELETE = &H3
        FO_MOVE   = &H1
        FO_RENAME = &H4
    End Enum

    Private Structure SHFILEOPSTRUCT

        Public hwnd  As IntPtr
        Public wFunc As FO_Func

        <MarshalAs(UnmanagedType.LPWStr)>
        Public pFrom As String

        <MarshalAs(UnmanagedType.LPWStr)>
        Public pTo                   As String
        Public fFlags                As UShort
        Public fAnyOperationsAborted As Boolean
        Public hNameMappings         As IntPtr

        <MarshalAs(UnmanagedType.LPWStr)>
        Public lpszProgressTitle As String

    End Structure

    <DllImport("shell32.dll", CharSet:=CharSet.Unicode)>
    Private Shared Function SHFileOperation(
       <[In]> ByRef lpFileOp As SHFILEOPSTRUCT) As Integer
    End Function

    Private Shared _ShFile As SHFILEOPSTRUCT

    Public Shared Sub Copy(ByVal sSource As List(Of String), ByVal sTarget As String)
        _ShFile.wFunc = FO_Func.FO_COPY
        _ShFile.pFrom = String.Join(vbNullChar, sSource) + vbNullChar
        _ShFile.pTo   = sTarget
        SHFileOperation(_ShFile)
   End Sub

End Class

复制文件and/or文件夹就这么简单:

Dim copy_items_paths As List(Of String)
Dim target_path      As String

NativeCopy.Copy(copy_items_paths, target_path)