Что нового

Копируем файлы без "тормозов"

glax24

Знающий
Сообщения
72
Репутация
14
Pavel
Перед копированием файла проверяйте есть ли каталог назначения если нет то DirCreate
 

Pavel

Новичок
Сообщения
125
Репутация
3
glax24, тогда я понимаю придётся делать рекурсивную проверку по всему древу пути. Просто типа расширенная функция, а базовый функционал не выполняет, выходит. Я подумал, что это я чего-то недопонял.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Pavel [?]
мне нужно не папку копировать, а списки файлов, сохраняя структуру папок
если я правильно понял, то , условно, из корня папки А должны быть скопированы файлы и папки, а не сама папка А со всей начинкой? можно так

Код:
#include <Array.au3>
$folder_path = FileSelectFolder('', '')
$path_dest = FileSelectFolder('', '')
$aReturn = _FileSearch($folder_path, '*', 2, 0)

For $id = 1 To $aReturn[0]
	DirCopy($folder_path& '\' & $aReturn[$id], $path_dest & '\' & $aReturn[$id], 1)
Next

$aReturn_file = _FileSearch($folder_path, '*', 1, 0)

For $id = 1 To $aReturn_file[0]
	FileCopy($folder_path & '\' & $aReturn_file[$id], $path_dest & '\' & $aReturn_file[$id], 1)
Next

; #FUNCTION# ====================================================================================================
; Name...........:  _FileSearch
; Description....:  Search files and\or folders in a specified path (uses system Dir command)
; Syntax.........:  _FileSearch($sPath [, $sFileMask = "*" [, $iFlag = 0 [, $iSubDir = 1 [, $iSort = 0]]]])
; Parameters.....:  $sPath     - Path to search the file.
;                   $sFileMask - [Optional] Filter to use, default is "*". Search the Autoit3 helpfile for the word "WildCards" For details.
;                   $iFlag     - [Optional] Specifies whether to return files folders or both:
;                                                                                               $iFlag = 0 - Files and folders (default)
;                                                                                               $iFlag = 1 - Only files
;                                                                                               $iFlag = 2 - Only folders
;                   $iSubDir   - [Optional] Specifies whether to search in subfolders or not:
;                                                                                               $iSubDir = 1 - Search in subfolders (default). Returns full pathes.
;                                                                                               $iSubDir = 0 - Search without subfolders (only in $sPath). Returns filenames only.
;                   $iSort     - [Optional] Specifies whether to sort the output list (in alphabetic order) or not (default is 0 - do not sort).
;
; Return values..:  Success    - An array with the following elements:
;                                                                      $aArray[0] = Number of Files\Folders returned
;                                                                      $aArray[1] = 1st File\Folder
;                                                                      $aArray[2] = 2nd File\Folder
;                                                                      $aArray[3] = 3rd File\Folder
;                                                                      $aArray[n] = nth File\Folder
;                   Failure    - 0
;                      @Error:    1 = Path not found or invalid
;                                 2 = No File(s) Found
;
; Author.........:  G.Sandler (MrCreatoR).
; Modified.......:
; Remarks........:  This function uses system Dir command, to speed up the search.
; Related........:
; Link...........:
; Example........:
; ===============================================================================================================
Func _FileSearch($sPath, $sFileMask = '*', $iFlag = 0, $iSubDir = 1, $iSort = 0)
	Local $sOutBin, $sOut, $aOut, $sRead, $hDir, $sAttrib, $sFiles

	If Not StringInStr(FileGetAttrib($sPath), "D") Then
		Return SetError(1, 0, 0)
	EndIf

	If $iSubDir = 1 Then
		$sAttrib &= ' /S'
	EndIf

	If $iSort = 1 Then
		$sAttrib &= ' /O:N'
	EndIf

	Switch $iFlag
		Case 1
			$sAttrib &= ' /A-D'
		Case 2
			$sAttrib &= ' /AD'
		Case Else
			$sAttrib &= ' /A'
	EndSwitch

	$sOut = StringToBinary('0' & @CRLF, 2)
	$sPath = StringRegExpReplace($sPath, '\\+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, '^;+|;+$', '')
	$sFileMask = StringRegExpReplace($sFileMask, ';{2,}', ';')
	$aMasks = StringSplit($sFileMask, ';')

	For $i = 1 To $aMasks[0]
		If StringStripWS($aMasks[$i], 8) = "" Then
			ContinueLoop
		EndIf

		$sFiles &= '"' & $sPath & '\' & $aMasks[$i] & '"'

		If $i < $aMasks[0] Then
			$sFiles &= ';'
		EndIf
	Next

	$hDir = Run(@ComSpec & ' /U /C DIR ' & $sFiles & ' /B' & $sAttrib, @SystemDir, @SW_HIDE, 6)

	While 1
		$sRead = StdoutRead($hDir, False, True)

		If @error Then
			ExitLoop
		EndIf

		If $sRead <> "" Then
			$sOut &= $sRead
		EndIf
	WEnd

	$aOut = StringRegExp(BinaryToString($sOut, 2), '[^\r\n]+', 3)

	If @error Or UBound($aOut) < 2 Then
		Return SetError(2, 0, 0)
	EndIf

	$aOut[0] = UBound($aOut) - 1
	Return $aOut
EndFunc   ;==>_FileSearch
это не из примера Yashied,а но наверное можно примерно такое сделать и в его примере..
в данном примере копируется не папка А, а все из корня папки А. копируются все файлы и папки в указанную ..при этом структура папок сохраняется..
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
Заметил одну странную особенность функции _Copy_CopyDir()
Если имя каталога назначения начинается с имени каталога-источника - получаем ошибку 161 :( К стати, что означает 161?
Это баг/фича/или я что не так делаю? :-\
Вот иллюстрация:
Код:
#include "Copy.au3"

If Not _Copy_OpenDll() Then
	MsgBox(16, '', 'DLL not found.')
	Exit
EndIf

_Copy_CopyDir('c:\Temp\test', 'c:\Temp\test100500')

While 1
	$State = _Copy_GetState()
	If $State[0] Then
	Else
		Switch $State[5]
			Case 0
				MsgBox(64, '', 'Folder was successfully copied.')
			Case Else
				MsgBox(16, '', 'Folder was not copied.' & @CR & @CR & $State[5])
		EndSwitch
		Exit
	EndIf
WEnd


Если сделать, например,
Код:
_Copy_CopyDir('c:\Temp\test', 'c:\Temp\atest100500')
то все прекрасно работает...
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Dm666 [?]
Если имя каталога назначения начинается с имени каталога-источника - получаем ошибку 161
точно.
такая же ощибка
 

Dm666

Осваивающий
Сообщения
221
Репутация
48
Понятно, спасибо. Запасаюсь терпением :smile:

PS: Может заодно можно научить ее и все дерево каталогов создавать по пути назначения? Я имею ввиду что
Код:
_Copy_CopyDir('c:\Temp\Test', 'c:\Works\Test')
будет выдавать ошибку 3, если предварительно не выполнить
Код:
DirCreate ('c:\Works')

:whistle:
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Re: Копируем файлы без \"тормозов\"

Для x86 можешь скачать Copy.dll, для x64 будет позже.


Добавлено:
Сообщение автоматически объединено:

Кстати, все ошибки описаны здесь .
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Александр сказал(а):
а в архиве разве не она? Copy_x64.dll

Я не обновлял архив, только поправил Copy.dll. Архив выложу когда обновлю Copy_x64.dll, просто у меня сейчас нет под рукой 64-битной системы.
 
Автор
Yashied

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Обновил библиотеку, исправлена эта ошибка (исправлены только Copy.dll и Copy_x64.dll).
 

enk

Новичок
Сообщения
7
Репутация
1
Подскажите пожалуйста как в первом примере можно вывести проценты копирования в GUI или MsgBox?
Вопрос снят
 

Naisho

Знающий
Сообщения
86
Репутация
12
Пара вопросиков:
1. Код ошибки получаемый от _Copy_GetState($threadNum, 5) тот жэ, что и получаемый через @error от _Copy_GetState и _Copy_CopyFile ?
(например, если вызвать _Copy_GetState до первого вызова _Copy_CopyFile получаем @error = 3)
2. Если копируем с оптического привода и диск в определённом месте читается плохо или не читается совсем, что можно сделать? (например пропустить сбойные сектора (заполнить "нулями") и продолжить читать дальше или пытаться с н-ной попытки таки считать файл)
 

33abc

Новичок
Сообщения
1
Репутация
0
Добрый день!
У меня вылетает скомпилированная программа на Windows 8.1 (64). На Windows 7 (64) работает. Dll (64) загружается успешно (1), но вылет происходит после команды DllCall в функции __CP_CopyMoveProgress (она вызывается в _Copy_CopyFile).
Кто-нибудь пользуется в наши дни copy.au3? Есть альтернатива штатной FileCopy, чтобы программа не висла, и, желательно, чтобы была возможность показывать прогресс копирования файла?
Заранее спасибо!
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
альтернатива это второй экзешник, который получает данные от основной программы и копирует, и при этом передает основной программе детали копирования. реализуется это просто. И окно основной программы не виснет
 

SmokieBlahBlah

Новичок
Сообщения
3
Репутация
1
Ох уж эти мечты
Возможно ли создание очереди копирования, еще и чтобы прогресс общий был?
 
Верх