Копирование нескольких файлов "средствами ОС"

SKR

Нужно скопировать множество файлов, но с отображением системного окна процесса копирования.Один файл скопировать легко:
My.Computer.FileSystem.CopyFile(SrsFile, DstFile)
Т.е. нужно скормить ОС массив файлов, что бы она сама занималась расчетом времени, отображением общего процесса и т.п.
3 ответа

SKR

https://msdn.microsoft.com/en-us/library/windows/desktop/aa363852(v=vs.85).aspxмассив файлов копируют в цикле


SKR

Roman Mejtes,CopyFileEx -предполагает возврат % копирования в CallBack, а уж кодописатель сам мухлюет со свистелкамиТС спрашивал про системное (от слова Operation System) окно.SHFileOperation functionSKR,почитай про эту ф-цию и может там рядом еще какие есть.Даю тупо мой код (спойлер ниже), но я его в основном использую для копирования папок с файлами (когда ощутимое время ждать приходится, и вывод диалога имеет смысл). Чтоб набор-массив исходных файлов абы откуда попало, из разных папок я не делал.Хотя вот идея.SHFILEOPSTRUCT structure
Type: PCZZTSTRNote This string must be ******-null terminated.A pointer to one or more source file names. These names should be fully qualified paths to prevent unexpected results.
'wFunc - A value that indicates which operation to perform
 Public Const FO_MOVE = &H1
 Public Const FO_COPY = &H2
 Public Const FO_DELETE = &H3
 Public Const FO_RENAME = &H4

 'fFlags - Flags that control the file operation
 'Preserve undo information, if possible (класть в корзину)
 Public Const FOF_ALLOWUNDO = &H40
 'Respond with Yes to All for any dialog box that is displayed
 Public Const FOF_NOCONFIRMATION = &H10
 'Do not ask the user to confirm the creation of a new directory if required
 Public Const FOF_NOCONFIRMMKDIR = &H200
 'Do not copy the security attributes of the file.
 'The destination file receives the security attributes of its new folder.
 Public Const FOF_NOCOPYSECURITYATTRIBS = &H800
 'Do not display a dialog to the user if an error occurs.
 Public Const FOF_NOERRORUI = &H400
 'Do not display a progress dialog box.
 Public Const FOF_SILENT = &H4
 'Display a progress dialog box but do not show individual file names as they are operated on.
 Public Const FOF_SIMPLEPROGRESS = &H100
 'Windows Vista. Perform the operation silently, presenting no UI to the user.
 Public Const FOF_NO_UI = FOF_SILENT Or FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR Or FOF_NOERRORUI

 <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Unicode)>
 Public Structure SHFILEOPSTRUCT
 Dim hwnd As IntPtr
 Dim wFunc As Integer
 Dim pFrom As String
 Dim pTo As String
 Dim fFlags As Short
 Dim fAnyOperationsAborted As Boolean
 Dim hNameMappings As IntPtr
 Dim lpszProgressTitle As String
 End Structure

 Public Function ShellCopyFileFolder(ByVal strSource As String, ByVal strTarget As String, _
 Optional ByVal bMove As Boolean = False, _
 Optional ByVal bSilent As Boolean = True, _
 Optional ByVal bNoConfirmMakeDir As Boolean = True, _
 Optional ByVal bNoConfirm As Boolean = True, _
 Optional ByVal bNoShowErrors As Boolean = True, _
 Optional ByVal bNoCopySecurityAttribs As Boolean = True) As Boolean
 'bMove -использовать Move вместо Copy
 'bSilent - не показывать диалог копирования
 'bNoConfirmMakeDir -создавать папку, куда копировать без подтверждения
 'bNoConfirm -не задавать пользователю лишних вопросов
 'bNoShowErrors -не выводить диалоги про ошибки
 'bNoCopySecurityAttribs - не копировать права на исх. файлы и папки

 'ВАЖНО!!! при копировании папок
 'если папка strTarget существует, то папка с именем strSource копируется в strTarget
 'если папка strTarget НЕ существует, то она создается в strTarget и туда копируется содержимое strSource

 Dim SHFileOp As New SHFILEOPSTRUCT ' structure To pass To the Function
 Dim dwRes As Integer

 'коррекция
 strSource = InCorrectDir(strSource) & Chr(0) & Chr(0) 'убираем "\" на конце и добавляем "\0\0" 
 strTarget = InCorrectDir(strTarget) 'убираем "\" на конце

 With SHFileOp
 If bMove Then
 .wFunc = FO_MOVE
 Else
 .wFunc = FO_COPY
 End If
 .pFrom = strSource
 .pTo = strTarget
 If bSilent Then .fFlags = .fFlags Or FOF_SILENT
 If bNoConfirmMakeDir Then .fFlags = .fFlags Or FOF_NOCONFIRMMKDIR
 If bNoConfirm Then .fFlags = .fFlags Or FOF_NOCONFIRMATION
 If bNoShowErrors Then .fFlags = .fFlags Or FOF_NOERRORUI
 If bNoCopySecurityAttribs Then .fFlags = .fFlags Or FOF_NOCOPYSECURITYATTRIBS
 End With

 dwRes = SHFileOperation(SHFileOp)
 'If dwRes <> 0 Then Debug.Print "SHFileOperation Error " & CStr(dwRes)

 ShellCopyFileFolder = (dwRes = 0)

 End Function


SKR

Сорри, забыл декларацию самой ф-ции под спойлер засунуть.
Public Declare Unicode Function SHFileOperation Lib "shell32.dll" Alias "SHFileOperationW" _
 (ByRef lpFileOp As SHFILEOPSTRUCT) As Integer