Что нового

[Файловая система] Копирование файлов, отображение прогресса копирования в GUI

Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
joiner [?]
Доделал код обмена данными между скриптами для копирования файлов и папок.
"обточил" код обмена данными. в первом сообщении перезалит архив _CopyDirCopyFile+обмен.rar
в нем исходники. компилировать нужно оба файла в любом порядке. в файле Пример указано как применять и какие значения возвращаются функцией. применимо в любой конфигурации окна
 

Вовчик55

Новичок
Сообщения
57
Репутация
0
joiner, спасибо за функцию, но почему-то очень тормозит при копировании, допустим если копирую напрямую, то скорость: с диска на диск - 3-5мин; с диска на флешку 7-10мин. А если копирую с помощью вашей функции, то скорости такие: с диска на диск - 7-10мин; с диска на флешку - 30-35мин :( - то есть получается в 2-3 раза медленнее...
При этом судя по графику нагрузки на диск - он загружается под 100% будто во время копирования с помощью функции происходит чтение/запись каждые 0,1сек

PS копирую много мелких файлов, может быть из-за этого тормоза, но ведь когда копирую их же напрямую (средствами винды) то никаких тормозов нету
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Вовчик55 [?]
При этом судя по графику нагрузки на диск - он загружается под 100%
диск или процессор?

PS копирую много мелких файлов, может быть из-за этого тормоза,
каким образом копируешь :
папка со множеством мелких файлов
через диалоговое окно выбора файлов
используя массив как входящие данные
обозначь точнее.
я копировал системой папку , в которой 317 мелковесных файлов. и своей функцией. с физического диска на физический диск. диски внутренние. время копирования одинаковое
сами исходники нужно брать из первого сообщения темы. все коды, которые есть в других сообщениях могут быть не работоспособны.
в первом сообщении два варианта - копирование непосредственно из самой программы и копирование через дополнительный скрипт. какой использовал ты?
 

Вовчик55

Новичок
Сообщения
57
Репутация
0
Именно диск загружается (процессор может быть тоже, но я на него внимания не обращаю, т.к. не загружается до 100%)

Код:
;#RequireAdmin
#include <_CopyDirCopyFile.au3>

;Пример 1
Local $array[1][2]
$array[0][0] = 'H:\' ;'Полный путь к копируемым файлу или папке'
$array[0][1] = 'C:\000' ;'Полный путь к папке назначения'; путь назначения может быть только папкой
;массив должен быть только двумерным. с любым количеством строк - $array[$n][2]

$MainWin = GUICreate('', 400, 50, -1, -1)
$Progress = GUICtrlCreateProgress(10, 10, 380, 30)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
	$ret = _CopyDirCopyFile($array, '', 1, 1, 1, $Progress, '', '', 'Далее'); данные для копирования берутся из массива
            ConsoleWrite(@error & @CRLF)
	Exit
    Switch $nMsg
        Case -3
            Exit            
    EndSwitch
WEnd


На диске H:\ - 5600 файлов
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
твоя функция постоянно работает в цикле.. то есть диск загружен будет все время. нужны условия для копирования чтобы разгрузить систему и копировать только в нужный момент. по времени или когда изменились файлы. а так ты просто насилуешь систему.( не заметил exit)
и еще момент. если используешь только строку прогресса, то функция будет выглядеть так
Код:
_CopyDirCopyFile($array, '', 1, 1, 1, $Progress)

проверю отпишусь
 

Вовчик55

Новичок
Сообщения
57
Репутация
0
Без цикла то же самое было (долгое копирование). Просто цикл не убрал копируя пример с 1 страницы, у меня в коде было без цикла:
Код:
$Path = FileSelectFolder('Диск', '', '', 1, $Gui)
            If @error Then ContinueLoop
			Local $array[1][2]
			$array[0][0] = @HomeDrive & "\Program Files\1\4.Файлы\"
			$array[0][1] = $Path
			$MainWin = GUICreate('', 400, 50, -1, -1)
			$Progress = GUICtrlCreateProgress(10, 10, 380, 30)
			GUISetState(@SW_SHOW)

			$ret = _CopyDirCopyFile($array, '', 1, 1, 1, $Progress, '', '', 'Далее')
            ConsoleWrite(@error & @CRLF)
Завтра попробую как вы выше подсказали, сегодня уже голова не варит :smile:
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
использовал твой код в предыдущем сообщении. копировал папку "Пользователи" в семерке.
12 000 файлов и 3 000 папок. это так показывает система через свойство папки. на самом деле там более 15 000 файлов и 4 000 папок. моя функция копировала 14 минут
системная функция скопировала только то, что указано в свойствах. но не это важно, важно то, что время копирования было 13 минут. и скопировано на 2 ГБ меньше. при этом было заметно подвисание эксплорера(проводника)
что ты имел ввиду под загрузкой диска? чем ты смотришь эту загрузку?
 

Вовчик55

Новичок
Сообщения
57
Репутация
0
Копирую 5600 файлов (650Мб) с диска H (вирт. привод) на диск С в папку "000":
Напрямую (средствами win) - 1 мин 15 сек
С помощью функции - 2 мин 45 сек
Активность диска смотрю с помощью Hard Disk Sentinel Pro 4.10
Диск в покое
0GogX.jpg
При копировании функцией (сначала нормально, график загрузки не зашкаливает до 100%, а затем когда останавливается прогресс - диск загружен полностью (ровный график)
HSxX3CjlM.jpg
Даже то что загружается диск это ладно - там много мелких файлов, диски этого не любят. Но почему же время копирования увеличивается
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Вовчик55
измени в самой функции _CopyDirCopyFile количество байт для считывания
в начале функции переменная
Код:
Local $s = 102400

поставь это значение.
думаю что это значение нужно сделать динамическим. в зависимости от размера копируемого файла.
 

Вовчик55

Новичок
Сообщения
57
Репутация
0
Изменил
Код:
Local $s = 102400

как вы посоветовали, получилось так:
копирование напрямую: 0:52
копирование с помощью функции: 2:26 - при этом полоска прогресса заполняется до 100% за 50-55 сек но копирование при этом ещё идёт до 2:26 (судя по нагрузке диска, и в конце копирования сделал чтобы появлялось MsgBox)

PS не вникал в механизм работы функции, но есть предположение что она сначала копирует файл, затем проверяет (считывает его с диска/флешки) - и затем начинает копировать следующий - потому то и получается время копирования в 2-3 раза дольше чем напрямую (лишь моё предположение)
 
Автор
joiner

joiner

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

Да, изменение числа считываемых байт приводит к искажению визуальной части
Как преодолеть тормоза, пока не знаю. При копировании файлов не менее 1mb скорость копирования не ниже системной
 
Автор
joiner

joiner

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

в свете последнего обсуждения тестировал на скорость копирования нескольких тысяч мелковесных файлов (от 6кб до 300кб) - скорость копирования не ниже системной.

измененная функция в первом сообщении темы. также был изменен пример итеракции (смотри вложение в первом сообщении)
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
joiner
Правила распространяются и на участников, со статусом “AutoIt Гуру”.

Тему переношу...
 
Автор
joiner

joiner

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

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
joiner [?]
я не страдаю снобизмом. и значок "гуру" не я прилепил себе.
При чём здесь это, я про то что правила нужно читать!
А статус гуру (автоматом) прилепляется твоими действиями, за помощь окружающим.

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

можно было бы сразу перенести
Возможно оно сразу не бросилось в глаза.

сразу не смог понять к какой категории можно отнести свой код
Не нужно гадать, на будущее, если решился создавать тему в определённом разделе, то прочти его правила, сразу станет ясно, относится твоя тема именно к этому разделу, или нет.
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR [?]
При чём здесь это, я про то что правила нужно читать!
ты же зацепил мой статус.
[?]
Правила распространяются и на участников, со статусом “AutoIt Гуру”.
ну да ладно.
еще раз перечитал правила раздела "полезняшки" и не нашел в чем нарушение?
я разместил отдельную функцию, а не программу. привел пример применения. код вместе с примером небольшой.
это не спор , а желание понять отличия .
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
joiner [?]
ты же зацепил мой статус
Это не зацепка, а перевод внимания на то, что правила нужно читать, и не забывать об этом.

еще раз перечитал правила раздела "полезняшки" и не нашел в чем нарушение?
Цитирую:
[?]
Скрипт не должен содержать большой код, а также должен быть прост для понимания (новичкам).
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Код:
If Not $fd = 0 Then
	$fs = 1
Else

можно записать как
Код:
If $fd Then
	$fs = 1
Else

а ещё лучше сразу так
Код:
$fd = StringInStr(FileGetAttrib($ArrayFileCopy[0][0]), 'D') > 0
If $fd Then
	$fs = 1
Else

или так
Код:
$fd = _FO_IsDir($ArrayFileCopy[0][0])
If $fd Then
	$fs = 1
Else

И в дальнейшем сравнении
Код:
If $fs = 1 Then

заменить на
Код:
If $fs Then
 
Автор
joiner

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
CreatoR
регламента на код в цифровом выражении нет. слова про небольшой код весьма расплывчаты. в основном разделе ясно написано, что менее 500 строк.
насчет понятности для новичков, то http://autoit-script.ru/index.php/topic,316.msg2158.html#msg2158 не совсем для новичков. когда я только начинал, то даже то, что написал AZJIO ( в сообщении выше) для меня было непонятным . вобщем, я разницы не уловил, но принимаю все как есть. дальше вопросов задавать не буду.

AZJIO, спасибо за пример улучшения кода..
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
А ещё на 1 и 2 странице ссылки на старые версии FileOperations.au3. Лучше указать ссылку на тему где я обновляю. Последние изменения не конфликтуют по формату со старыми версиями, а только наращиваются, иначе бы я отписал об этом.
 
Верх