Автор Тема: Копируем файлы без "тормозов"  (Прочитано 33291 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
AutoIt: 3.3.6.1
Версия: 1.4

Категория: Файловая система, Процессы

Описание: Эта небольшая библиотека позволяет простым и надежным способом копировать файлы без "подвешивания" скрипта. Помимо этого, можно получать текущее состояние (количество скопированных байт) в процессе копирования. Работа с этой UDF аналогична работе с функцией InetGet().

Файл(ы): Copy.zip

Пример1 (копирование одного файла):
(нажмите для показа/скрытия)

Пример2 (копирование нескольких файлов одновременно):
(нажмите для показа/скрытия)

Пример3 (GUI, копирование файлов):
(нажмите для показа/скрытия)

Пример4 (GUI, копирование папок):
(нажмите для показа/скрытия)

Скриншот:


Источник: Copy UDF (оффициальный форум)
Автор: Yashied
« Последнее редактирование: Май 18, 2012, 02:58:29 от Yashied »


Думай, прежде чем говорить.

Русское сообщество AutoIt

Копируем файлы без "тормозов"
« Отправлен: Ноябрь 05, 2010, 04:14:48 »

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Копируем файлы без "тормозов"
« Ответ #1, Отправлен: Ноябрь 05, 2010, 04:19:00 »
а папки копировать умеет? :)
Конференция посвященная AutoIt на jabber.ru - [email protected]
Как попасть на конференцию читаем тут


Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #2, Отправлен: Ноябрь 05, 2010, 04:22:16 »
а папки копировать умеет?

Не умеет. Это тривиальная задача, и каждый может самостоятельно это написать.

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Копируем файлы без "тормозов"
« Ответ #3, Отправлен: Ноябрь 05, 2010, 04:25:51 »
Yashied  [?]
Цитировать
каждый может самостоятельно это написать
темы на форуме говорят об обратном  :whistle:
но на самом деле я тупанул, почему то показалось что это программа. а это UDF.

Русское сообщество AutoIt

Re: Копируем файлы без "тормозов"
« Ответ #3 Отправлен: Ноябрь 05, 2010, 04:25:51 »

Оффлайн CreatoR [?]

  • Администратор
  • *
  • Сообщений: 7827
  • Репутация: 2287
  • Пол: Мужской
  • AutoIt is simple, subtle, elegant
    • CreatoR's Lab
    • Награды
  • Версия AutoIt: 3.3.10.2
Re: Копируем файлы без "тормозов"
« Ответ #4, Отправлен: Ноябрь 05, 2010, 10:43:00 »
Yashied  [?]
Цитировать
Работа с этой UDF аналогична работе с функцией InetGet(). Одновременно можно копировать только один файл.
Вообще то InetGet уже позволяет качать одновременно более одного файла.


Правила, Поиск, Супер тема


AutoIt is simple, subtle, elegant.


«Не оказываю тех. поддержку через ПМ/ICQ, и по электронной почте - для этого есть форум. (C)»
«Законы Мэрфи неоспоримы!»


Мои работы

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #5, Отправлен: Ноябрь 05, 2010, 12:32:58 »
Вообще то InetGet уже позволяет качать одновременно более одного файла.

Я не в смысле количества одновременно копируемых файлов, а в принципе работы в целом.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #6, Отправлен: Ноябрь 05, 2010, 13:37:36 »
Обновил библиотеку: добавил функцию _Copy_MoveFile().

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #7, Отправлен: Ноябрь 05, 2010, 22:24:57 »
Обновил библиотеку (версия 1.2). Теперь можно копировать/перемещать несколько (до 256 :)) файлов одновременно без какого-либо влияния на выполнение скрипта. Технически, все делает Copy.dll, а Copy UDF лишь его обертка для простоты использования в AutoIt. Кому интересно, вот код Copy.dll, написанный на PB 4.50:

Global Kernel.l = OpenLibrary(#PB_Any, "kernel32.dll")

Structure Parameters
*Source
*Destination
*Proc
*Ptr
*Cancel
Flags.l
EndStructure

Structure Result
TotalBytesTransferred.q
Abort.l
SystemErrorCode.l
Progress.l
EndStructure

Procedure.l CopyProgressRoutine(TotalFileSize.q, TotalBytesTransferred.q, StreamSize.q, StreamBytesTransferred.q, StreamNumber.l, CallbackReason.l, *SourceFile, *DestinationFile, *Param.Result)
*Param\TotalBytesTransferred = TotalBytesTransferred
If *Param\Abort
ProcedureReturn 1 ; PROGRESS_CANCEL
Else
ProcedureReturn 0 ; PROGRESS_CONTINUE
EndIf
EndProcedure

Procedure Copy(*Param.Parameters)
If Not CallFunction(Kernel, "CopyFileExW", *Param\Source, *Param\Destination, *Param\Proc, *Param\Ptr, *Param\Cancel, *Param\Flags)
PokeL(*Param\Ptr + 12, CallFunction(Kernel, "GetLastError"))
EndIf
PokeL(*Param\Ptr + 16, 0)
FreeMemory(*Param\Source)
FreeMemory(*Param\Destination)
FreeMemory(*Param)
EndProcedure

Procedure Move(*Param.Parameters)
If Not CallFunction(Kernel, "MoveFileWithProgressW", *Param\Source, *Param\Destination, *Param\Proc, *Param\Ptr, *Param\Flags)
PokeL(*Param\Ptr + 12, CallFunction(Kernel, "GetLastError"))
EndIf
PokeL(*Param\Ptr + 16, 0)
FreeMemory(*Param\Source)
FreeMemory(*Param\Destination)
FreeMemory(*Param)
EndProcedure

Procedure.l CopyMoveFileProgress(*Source, *Destination, Flags.l, *Ptr.Result, Action.l)
If Not Kernel
ProcedureReturn 0
EndIf
SourceLen.l = 2 * (CallFunction(Kernel, "lstrlenW", *Source) + 1)
DestinationLen.l = 2 * (CallFunction(Kernel, "lstrlenW", *Destination) + 1)
*Param.Parameters = AllocateMemory(SizeOf(Parameters))
*Param\Source = AllocateMemory(SourceLen)
*Param\Destination = AllocateMemory(DestinationLen)
*Param\Ptr = *Ptr
*Param\Cancel = 0
*Param\Flags = Flags
*Param\Proc = @CopyProgressRoutine()
*Ptr\TotalBytesTransferred = 0
*Ptr\Abort = 0
*Ptr\SystemErrorCode = 0
*Ptr\Progress = 1
CopyMemory(*Source, *Param\Source, SourceLen)
CopyMemory(*Destination, *Param\Destination, DestinationLen)
If Not Action
Result = CreateThread(@Copy(), *Param)
Else
Result = CreateThread(@Move(), *Param)
EndIf
If Not Result
*Ptr\SystemErrorCode = -1
*Ptr\Progress = 0
FreeMemory(*Param\Source)
FreeMemory(*Param\Destination)
FreeMemory(*Param)
ProcedureReturn 0
Else
ProcedureReturn 1
EndIf
EndProcedure

ProcedureDLL.l CopyFileProgressW(*Source, *Destination, Flags.l, *Ptr.Result)
ProcedureReturn CopyMoveFileProgress(*Source, *Destination, Flags.l, *Ptr.Result, 0)
EndProcedure

ProcedureDLL.l MoveFileProgressW(*Source, *Destination, Flags.l, *Ptr.Result)
ProcedureReturn CopyMoveFileProgress(*Source, *Destination, Flags.l, *Ptr.Result, 1)
EndProcedure

Русское сообщество AutoIt

Re: Копируем файлы без "тормозов"
« Ответ #7 Отправлен: Ноябрь 05, 2010, 22:24:57 »

Оффлайн Kaster [?]

  • Бритва, Бритва Оккама
  • Глобальный модератор
  • *
  • Сообщений: 4020
  • Репутация: 622
  • Пол: Мужской
  • Мой Аватар, он лучший самый
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Копируем файлы без "тормозов"
« Ответ #8, Отправлен: Ноябрь 05, 2010, 22:48:05 »
Yashied
а не многовато 256? скорость диска все равно является узким местом, обычно параллельная обработка 2-3 файлов за глаза.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #9, Отправлен: Ноябрь 05, 2010, 22:55:12 »
Yashied
а не многовато 256? скорость диска все равно является узким местом, обычно параллельная обработка 2-3 файлов за глаза.

Вот и я подумал, что 4294967296 (DWORD) одновременно копируемых файлов, это немного перебор :), и сделал 256. Это просто теоретический предел, для UDF, количество не имеет значения, все выполняет API.

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #10, Отправлен: Ноябрь 07, 2010, 01:31:22 »
Добавил еще один пример на рекурсивное копирование папок (см. первый пост).
« Последнее редактирование: Ноябрь 07, 2010, 04:18:25 от Yashied »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #11, Отправлен: Ноябрь 25, 2010, 04:38:03 »
Обновил библиотеку. Добавлена поддержка x64 (Copy_x64.dll).

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #12, Отправлен: Февраль 17, 2011, 11:58:22 »
Yashied,
Решил воспользоваться Вашей библиотекой Copy.au3 для множественного перемещения(копирования) файлов в этой теме: Умная автозамена при перемещении.
К сожалению (моему), уровень моих знаний PB 4.50 никогда не поднимался выше 0 и в исходнике Copy.dll я ничего не понял.
Скажите, пожалуйста, я правильно понял назначение параметров в функциях _Copy_CopyFile() и _Copy_MoveFile()?
$sSource - файл-источник;
$sDestination - файл-назначение;
$iFlags - 0 перезаписывать имеющиеся файлы;
            1 не перезаписывать имеющиеся файлы;
$iID -    индекс функции для отображения прогресса выполнения.

И еще один вопрос. Что задает параметр $iIndex в функции _Copy_GetState()?
Спасибо.
« Последнее редактирование: Февраль 17, 2011, 17:50:07 от madmasles »

Оффлайн Yashied [?]

  • AutoIt MVP
  • Глобальный модератор
  • *
  • Сообщений: 5379

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #13, Отправлен: Февраль 17, 2011, 15:04:20 »
Сегодня я выложу версию 1.3 этой библиотеки. Там уже можно будет копировать не только файлы, но и папки целиком. Также будет описание ко всем функциям (на английском) и еще несколько дополнительных функций.

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #14, Отправлен: Февраль 17, 2011, 15:07:41 »
Yashied  [?]
Цитировать
Сегодня я выложу версию 1.3 этой библиотеки.
Понял, спасибо, буду ждать.
 :IL_AutoIt_1:

Русское сообщество AutoIt

Re: Копируем файлы без "тормозов"
« Ответ #14 Отправлен: Февраль 17, 2011, 15:07:41 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
6 Ответов
12733 Просмотров
Последний ответ Октябрь 07, 2009, 09:36:42
от akoulev
12 Ответов
12628 Просмотров
Последний ответ Декабрь 01, 2012, 02:05:11
от defens
16 Ответов
7353 Просмотров
Последний ответ Октябрь 17, 2010, 02:44:12
от Yashied
2 Ответов
7826 Просмотров
Последний ответ Ноябрь 02, 2010, 11:58:00
от Linaleks
8 Ответов
21413 Просмотров
Последний ответ Февраль 09, 2011, 22:04:08
от Kaster
4 Ответов
5765 Просмотров
Последний ответ Апрель 05, 2011, 01:06:51
от assch
8 Ответов
10718 Просмотров
Последний ответ Апрель 10, 2011, 11:50:11
от madmasles
6 Ответов
6048 Просмотров
Последний ответ Август 05, 2011, 23:10:44
от Yashied
2 Ответов
5608 Просмотров
Последний ответ Октябрь 17, 2011, 20:18:09
от Gorenich
6 Ответов
4015 Просмотров
Последний ответ Июнь 16, 2012, 17:27:05
от rollex