Что нового

[Баг] Зависание процесса при функции DirCopy

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
Обнаружился баг в функции DirCopy
В папке E:\15_1 находится 90.000 файлов, все файлы весят 2,5 Gb
Цель скопировать папку E:\15_1 в C:\1\15_1
Но процесс висит. Прождал час, результата нет.
Версия Autoit 3.3.14.0

Код:
$hTimer=TimerInit() 
$itog=DirCopy('E:\15_1','C:\1\15_1',1)
$iDiff=TimerDiff($hTimer)
MsgBox(4096,"Переменная ","$itog =>" & $itog & "<=" & @CRLF & "$iDiff =>" & $iDiff & "<=")


Total Commander, TeraCopy... справляются с копированием такой папки за 5-7 минут.
 

joiner

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

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
joiner [?]
На форуме есть примеры
1. Можно ли ссылки на подобные примеры, в поиск, что только не вводил, нет нужного результата.
2. Можно ли надеяться на то, что этот баг будет исправлен авторами Autoit?
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Самый простой способ - xcopy.

P.S

Garrett, ссылка нерабочая.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Andrey_A
этот баг будет исправлен
Чтобы исправить ошибку, её нужно воспроизвести. У меня на Win7x86, Autoit 3.3.14.2, C:\ и E:\ на одном диске этот скрипт выполняется нормально
Код:
$Dir = "E:\15_1"
DirCreate($Dir)
For $i = 1 To 90000
  $f = FileOpen($Dir & "\" & $i & ".zzz", 2)
  FileSetPos($f, 30000, 0)
  FileSetEnd($f)
  FileClose($f)
  If Not Mod($i, 1000) Then ConsoleWrite($i & @CRLF)
Next
ConsoleWrite(DirGetSize($Dir) & @CRLF)

DirCopy($Dir, "C:\1\15_1", 1)
ConsoleWrite(DirGetSize("C:\1\15_1") & @CRLF)
Время выполнения всего скрипта (с отключённым антивирусом ;) ) по данным SciTE Time: 369.2. Процесс копирования можно отслеживать в проводнике.
 
Автор
A

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
InnI, вновь созданные файлы копируются. У меня Win7x64.
Но вот папка http://rghost.ru/private/7zDhzwJJJ/ccdfc50aad48c9d46f4ec2d2a41c62a4 , которая не хочет копироваться.

-------- Добавлено --------------
InnI, замените в вашем коде расширение zzz на html и уже не работает копирование папки. Странность какая-то...


-------- Добавлено --------------
Функция DirMove() тоже ведёт к той же ситуации. Процесс висит - перемещение не происходит...
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Andrey_A
Странность какая-то...
Да, странность есть и она, похоже, системная.
Если оставить примерно 5000 html-фалов и скопировать, то у AutoIt это займёт чуть больше минуты. Теперь открываем эту папку в проводнике, выделяем все html-файлы и удаляем. На "подготовку к удалению" у проводника уйдёт тоже больше минуты. А теперь очистим корзину. Время очистки составит три(!) минуты. Причём эти проблемы наблюдаются только с расширениями htm и html. Пробовал другие расширения: txt, xml, mht, zzz - проблем нет - всё копируется и удаляется быстро.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Скорее всего в реестре на .html файлы висит какой-то обработчик, удалите его, и будет все хорошо.


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

Попробуйте удалить вот это:

Код:
HKEY_CLASSES_ROOT\htmlfile\shellex\{8895B1C6-B41F-4C1C-A562-0D564250836F}
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
удалять что-то в реестре ради копирования это, извините меня, глюк.
использовал пример InnI с заменой на html, но копировал своей функцией. время копирования - 3 мин. 30 сек.
думаю, что стоит уведомить разрабов языка о таком глюке функции DirCopy
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я пока не вижу никакого глюка со стороны AutoIt. Как написал Innl, в проводнике Windows наблюдается такая же "аномальная" ситуация.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
я могу понять, что системные службы могут производить какие-то там дополнительные действия с файлами, из-за чего вот такие косяки с удалением и копированием. но причем тут нативные? если нативная работает как системная, то преимущества никакого.
Пофайловое копирование делает ненужными нативные функции копирования(перемещения). ну разве что для десятка файлов средней величины
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Yashied [?]
я высказал свое мнение насчет нативной функции DirCopy(плюсом к ней можно отнести DirRemove и DirMove). Может стоит спросить у разрабов почему такие зависания и можно ли что то сделать с этим.Раз уж тему такую подняли
К тому же, у ТС копирование папки вообще не произошло, что говорит, если не о баге, то о крайне неудовлетворительной работе функции(хотя не скопировать за час ни одного файла это уже баг)
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
InnI сказал(а):
У меня на Win7x86, Autoit 3.3.14.2, C:\ и E:\ на одном диске этот скрипт выполняется нормально.

Andrey_A сказал(а):
InnI, замените в вашем коде расширение zzz на html и уже не работает копирование папки. Странность какая-то...

InnI сказал(а):
Да, странность есть и она, похоже, системная. Причём эти проблемы наблюдаются только с расширениями htm и html. Пробовал другие расширения: txt, xml, mht, zzz - проблем нет - всё копируется и удаляется быстро.

Проблема не связана с AutoIt.
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
копирую папку системными средствами - "копировать - вставить" - минута времени
"вырезать - вставить" - минута времени
XCOPY - ~3мин
пользовательская функция (FileRead-FileWrite) - от 2 мин. 40 сек. до 3 мин. 30 сек.
функция DirCopy- стабильно "до утра".
Это не проблема AutoIT это проблема одной функции, которая работает по принципу - "открыть папку, выделить все файлы, подготовка к копированию(ждем долго долго), копировать все файлы".
Да, по сути бага нет. Есть неэффективная работа функции (мягко говоря)
Вот и хотелось бы, чтобы , если есть возможность, этот момент был улучшен.
 
Автор
A

Andrey_A

Продвинутый
Сообщения
319
Репутация
68
Yashied [?]
Попробуйте удалить вот это:
Код:
HKEY_CLASSES_ROOT\htmlfile\shellex\{8895B1C6-B41F-4C1C-A562-0D564250836F}

У меня этот ключ не удаляется... или только через безопасный режим пробовать... Но вдруг без него что-то перестанет работать, - реестр штука тонкая...

Нашёл обход этого глюка:

Код:
; Копирование папки с помощью xcopy
Func _DirCopy($sSrc,$sDest)
  RunWait('xcopy /H /E /C /I /S /K /X /T /Y'&' "'&$sSrc&'" "'&$sDest & '"','',@SW_HIDE)
EndFunc
; Удаление папки с помощью cmd
Func _DirRemove($sSrc)
  RunWait(@Comspec&' /C RMDIR /S /Q "'&$sSrc&'"','',@SW_HIDE)
EndFunc


А вот для перемещения пока нет варианта, т.к. MOVE не работает на разных локальных дисках, т.е. не произойдёт перемещение:

Код:
_DirMove('E:\15_1','C:\1\15_1')

Func _DirMove($sSrc,$sDest)
  RunWait(@Comspec&' /C MOVE /Y "'&$sSrc&'" "'&$sDest&'"','',@SW_HIDE)
EndFunc


Может есть другое какое-то решение по перемещении папки?

joiner [?]
Вот и хотелось бы, чтобы , если есть возможность, этот момент был улучшен.
Я двумя руками за!
 

joiner

Модератор
Локальный модератор
Сообщения
3,556
Репутация
628
Andrey_A
Используй пользовательские функции и забудь про консоль и dircopy
Премещение это копирование и потом удаление. Или одновременно - копируешь, удаляешь ..... и так далее
 
Верх