如何在 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)
我正在 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)