【问题标题】:How to copy multiple files/folders using single windows copy GUI in VB.Net如何在 VB.Net 中使用单个窗口复制 GUI 复制多个文件/文件夹
【发布时间】:2023-03-18 07:48:01
【问题描述】:

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

所以,如果我对每个文件/文件夹都这样做:

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

它工作正常并显示此窗口:

这很好,但是,如果我有许多文件和/或文件夹,并且我遍历它们并调用上面的命令,它们会为每个文件/文件夹启动一个新的复制窗口,而不是启动一个将它们全部组合在一起的 GUI ,就像这样:

是否可以将多个文件/文件夹复制过程合并到一个 Windows 资源管理器复制窗口 GUI 中?

【问题讨论】:

  • 好问题。我只在互联网上找到了 for-next-loop-examples。但这并不能解决您的问题...
  • SHFileOperation 函数。
  • 您希望每个文件夹显示一个任务吗?还是每个文件?如果是后者——甚至是前者——你必须小心,你最终不会得到一千次展示!对此有何指导方针?这应该是可能的,但是,再次,应该施加什么限制?

标签: vb.net windows-explorer


【解决方案1】:

感谢@Jimi,我被指出了SHFileOperations 的方向,所以我想出了如何做到这一点。我做了一个小班来做到这一点:

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

复制文件和/或文件夹就这么简单:

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

NativeCopy.Copy(copy_items_paths, target_path)

【讨论】:

  • 干得好 :) 我建议,因为您可能还想实现删除和移动操作,也可以使用fFlags 标志,如FOF_ALLOWUNDO = &amp;H40,它允许撤消操作(即使是简单的CTRL + Z)。
  • 顺便说一句,最好在 Copy 方法中创建一个新的 SHFILEOPSTRUCT,而不是使用 static 字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-06
  • 1970-01-01
相关资源
最近更新 更多