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

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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #30, Отправлен: Сентябрь 05, 2011, 18:40:24 »
Yashied  [?]
Цитировать
Она сама снимает "Read Only" и "Hidden" атрибуты при копировании и перемещении папок.
Спасибо!  :thanks:
Два вопроса:
1. Атрибуты только снимает или восстанавливает исходные?
2. Будет ли версия х64?

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

Re: Копируем файлы без "тормозов"
« Ответ #30 Отправлен: Сентябрь 05, 2011, 18:40:24 »

Оффлайн Yashied [?]

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

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

Восстанавливать атрибуты не нужно, это делается автоматически самой системой. А вот чтобы перезаписать файл с этими атрибутами, их необходимо предварительно снять у старого файла, в противном случае система выдаст ошибку. Copy.dll снимает эти атрибуты только перед самой перезаписью, и, если, что-то не так, то у других файлов атрибуты остануться нетронутыми.

Будет ли версия х64?

Конечно, как только доберусь до соответствующей системы.


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

Оффлайн madmasles [?]

  • Глобальный модератор
  • *
  • Сообщений: 7790
  • Репутация: 2317
  • Пол: Мужской
  • Награды За модерирование форума
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #32, Отправлен: Сентябрь 05, 2011, 19:32:42 »
Yashied,
Понял, еще раз спасибо.  :thanks:

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #33, Отправлен: Сентябрь 05, 2011, 22:22:22 »
Yashied спасибо за помощь.
Получилось что задумал, на вход функции можно подавать как каталоги так и файлы
Код: AutoIt [Выделить]
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#Include "Copy.au3"

Global $Copy = False,$State,$Data
If Not _Copy_OpenDll() Then
    MsgBox(16, '', 'DLL not found.')
    Exit
EndIf

$Source1 = @ScriptDir&'\na_flesh'
$Destination1 = 'G:\'
$Source2 = 'h:\BCDW\ACRONIS.ISO'
$Destination2 = 'G:\ACRONIS.ISO'
$Source3 = 'h:\A386'
$Destination3 ='G:\A386'


#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", 295, 287, 345, 175)
$Button_Start = GUICtrlCreateButton("Старт", 72, 96, 121, 33)
$Button_Stop = GUICtrlCreateButton("Стоп", 72, 96, 121, 33)
GUICtrlSetState($Button_Stop,$GUI_HIDE)
$Progress = GUICtrlCreateProgress(0, 152, 289, 25)
$Label = GUICtrlCreateLabel("", 0, 192, 292, 28)
$Label1 = GUICtrlCreateLabel("", 0, 230, 292, 28)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1

    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button_Start
            Start()
        EndSwitch
WEnd
Func Start()
    GUICtrlSetData($Label1, 'Func_1')
    Copy_Start($Source1,$Destination1)
    GUICtrlSetData($Label1, 'Func_2')
    Copy_Start($Source2,$Destination2)
    ;Copy_Start($Source3,$Destination3)
    GUICtrlSetData($Label1, 'Func_End')
EndFunc ; ===>Start()

Func Copy_Start($Source, $Destination)

$res = Copy_File_Dir($Source,$Destination)
If $res < 0 Then Return -1

While 1
;-----copy----
    If $Copy Then
        $State = _Copy_GetState()
        If $State[0] Then
            If $State[0] = -1 Then
                ; Preparing
            Else
                $Data = Round($State[1] / $State[2] * 100)
                If GUICtrlRead($Progress) <> $Data Then
                    GUICtrlSetData($Progress, $Data)
                EndIf
                $Data = StringRegExpReplace($State[6], '^.*\\', '')
                If GUICtrlRead($Label) <> $Data Then
                    GUICtrlSetData($Label, $Data)
                EndIf
            EndIf
        Else
            Switch $State[5]
                Case 0
                    GUICtrlSetData($Progress, 100)
                    ;MsgBox(64, '', 'Данные успешно скопированы.', 0, $Form1)
                    GUICtrlSetData($Label, 'Данные успешно скопированы.')
                Case 1235 ; ERROR_REQUEST_ABORTED
                    MsgBox(16, '', 'Копирование было прервано.', 0, $Form1)
                Case Else
                    MsgBox(16, '', 'Данные не были скопированы.' & @CR & @CR & $State[5], 0, $Form1)
            EndSwitch
            ;GUICtrlSetState($Button_Start, $GUI_ENABLE)
            GUICtrlSetState($Button_Start, $GUI_SHOW)
            GUICtrlSetState($Button_Stop, $GUI_HIDE)
            GUICtrlSetData($Progress, 0)
            GUICtrlSetData($Label, 'Данные успешно скопированы.')
            $Copy = 0
            ExitLoop
        EndIf
    EndIf
;Sleep(1)
;----end copy-----
$nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit
        Case $Button_Stop
             _Copy_Abort()
EndSwitch
WEnd

EndFunc ;===>Copy_Start()

Func Copy_File_Dir($Source, $Destination)

                If (Not $Source) Or (Not $Destination) Then
                    MsgBox(16, '', 'Источник и назначение не определены', 0, $Form1)
                    Return -1
                    ;ContinueLoop
                EndIf
                If FileExists($Destination) And StringLen($Destination) >3 Then
                   If MsgBox(36, '', $Destination & ' уже существует.' & @CR & @CR & 'Заменить?', 0, $Form1) <> 6 Then
                       Return -1
                       ;ContinueLoop
                   EndIf
                   GUICtrlSetData($Label, 'Удаление ' & $Destination)

                          If StringInStr(FileGetAttrib($Source), "D") = 0 Then

                             If StringInStr(FileGetAttrib($Destination),  "R") <> 0 Then FileSetAttrib($Destination,'-R+N')
                             FileDelete($Destination)
                        Else
                                DirRemove($Destination,1)
                          EndIf
               EndIf
                ;GUICtrlSetState($Button_Start, $GUI_DISABLE)
                GUICtrlSetState($Button_Start, $GUI_HIDE)
                GUICtrlSetState($Button_Stop, $GUI_SHOW)
                If StringInStr(FileGetAttrib($Source), "D") = 0 Then
                _Copy_CopyFile($Source, $Destination)
                Else
                _Copy_CopyDir($Source, $Destination)
                EndIf
                $Copy = 1

Return 1
EndFunc ; ===>Copy_Dir()


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

Re: Копируем файлы без "тормозов"
« Ответ #33 Отправлен: Сентябрь 05, 2011, 22:22:22 »

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #34, Отправлен: Ноябрь 12, 2011, 22:22:40 »
Yashied
Как решить проблему. При копирование каталога с жесткого например на флешку, а в каталоге файл autorun.inf и при включенном антивируснике ясное дело копирование этого файла блокируется, и соответственно из за одного файла прекращается копирование всего каталога (копирование завершается с ошибкой).

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #35, Отправлен: Ноябрь 12, 2011, 23:25:22 »
Код: AutoIt [Выделить]
$listdir = _FileListToArray($PATH_DIR1, '*', 0) ; список файлов и/или папок
        For $i = 1 To $listdir[0]
        If $listdir[$i] = 'autorun.inf' Then ContinueLoop
        Copy_Start($PATH_DIR1 & $listdir[$i], $PATH_DIR2 & $listdir[$i])
        Next

Нашел решение, только так.

Оффлайн Yashied [?]

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

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #36, Отправлен: Январь 03, 2012, 15:44:28 »
Обновил библиотеку, исправлена одна ошибка.

Оффлайн Pavel [?]

  • Новичок
  • *
  • Сообщений: 125
  • Репутация: 3
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #37, Отправлен: Апрель 12, 2012, 12:54:02 »
Подскажите, с каким флагом нужно использовать функцию _Copy_FileCopy, чтобы автоматически создавать папки по пути назначения? (аналог флага '8' у стандартной FileCopy)

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

Re: Копируем файлы без "тормозов"
« Ответ #37 Отправлен: Апрель 12, 2012, 12:54:02 »

Оффлайн Yashied [?]

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

  • Автор темы
  • Репутация: 2695
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.x.x
Re: Копируем файлы без "тормозов"
« Ответ #38, Отправлен: Апрель 12, 2012, 13:44:07 »
Для копирования папок нужно использовать _Copy_CopyDir(), см. Copy_Ex2.au3 в архиве.

Оффлайн Pavel [?]

  • Новичок
  • *
  • Сообщений: 125
  • Репутация: 3
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #39, Отправлен: Апрель 12, 2012, 13:47:47 »
Yashied, мне нужно не папку копировать, а списки файлов, сохраняя структуру папок. FileCopy с флагом '8' это умеет, но зачастую подвисает на больших файлах + подвисает при выполнении.

Оффлайн glax24 [?]

  • Новичок
  • *
  • Сообщений: 72
  • Репутация: 14
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #40, Отправлен: Апрель 13, 2012, 22:53:32 »
Pavel
Перед копированием файла проверяйте есть ли каталог назначения если нет то DirCreate

Оффлайн Pavel [?]

  • Новичок
  • *
  • Сообщений: 125
  • Репутация: 3
    • Награды
Re: Копируем файлы без "тормозов"
« Ответ #41, Отправлен: Апрель 14, 2012, 01:02:03 »
glax24, тогда я понимаю придётся делать рекурсивную проверку по всему древу пути. Просто типа расширенная функция, а базовый функционал не выполняет, выходит. Я подумал, что это я чего-то недопонял.

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2695
  • Репутация: 457
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Копируем файлы без "тормозов"
« Ответ #42, Отправлен: Апрель 14, 2012, 08:44:11 »
Pavel  [?]
Цитировать
мне нужно не папку копировать, а списки файлов, сохраняя структуру папок
если я правильно понял, то , условно, из корня папки А должны быть скопированы файлы и папки, а не сама папка А со всей начинкой? можно так

(нажмите для показа/скрытия)
это не из примера Yashied,а  но наверное можно примерно такое сделать и в его примере..
в данном примере копируется не папка А, а все из корня папки А. копируются все файлы и папки в указанную ..при этом структура папок сохраняется..
Были времена, когда солнце было ярче, трава зеленее, а водка сорокоградуснее

Оффлайн Dm666 [?]

  • Осваивающий
  • **
  • Сообщений: 214
  • Репутация: 48
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.8.0
Re: Копируем файлы без "тормозов"
« Ответ #43, Отправлен: Апрель 25, 2012, 13:53:22 »
Заметил одну странную особенность функции _Copy_CopyDir()
Если имя каталога назначения начинается с имени каталога-источника - получаем ошибку 161  :( К стати, что означает 161?
Это баг/фича/или я что не так делаю?  :-\
Вот иллюстрация:
Код: AutoIt [Выделить]
#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


Если сделать, например,
Код: AutoIt [Выделить]
_Copy_CopyDir('c:\Temp\test', 'c:\Temp\atest100500')

то все прекрасно работает...

Оффлайн joiner [?]

  • Расмус-бродяга
  • AutoIt Гуру
  • *****
  • Сообщений: 2695
  • Репутация: 457
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Копируем файлы без "тормозов"
« Ответ #44, Отправлен: Апрель 25, 2012, 14:41:36 »
Dm666  [?]
Цитировать
Если имя каталога назначения начинается с имени каталога-источника - получаем ошибку 161
точно.
такая же ощибка

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

Re: Копируем файлы без "тормозов"
« Ответ #44 Отправлен: Апрель 25, 2012, 14:41:36 »

 

Похожие темы

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