Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Отображение процесса перемещения файлов (http://forum.oszone.net/showthread.php?t=165419)

cra5h_ 28-01-2010 17:29 1332576

Отображение процесса перемещения файлов
 
Подскажите как можно сделать отображение процесса перемещения файлов, пробовал через GuiCtrlCreateAvi + файл avi , но видео не воспроизводится а отображается как статическая картинка пытался найти аналогичное видео через shell32 но не нашол. Собственно нужно лишь постоянное воспроизвидение видео до завершения процесса перемещения

Creat0R 28-01-2010 22:26 1332858

Цитата:

Цитата cra5h_
как можно сделать отображение процесса перемещения файлов »

FilesCopyProgress UDF

Для перемещения можно приспособить удалив файл по окончанию копирования :)

cra5h_ 29-01-2010 10:08 1333205

а как можно сделать видео(анимация) как в проводнике Windows при копировании/перемещении(документы летают из папки в папку) ?

Yashied 29-01-2010 10:13 1333213

shell32.dll -> AVI -> 161

Код:

GUICtrlCreateAvi(@SystemDir & "\shell32.dll", 161, 50, 10)

cra5h_ 29-01-2010 10:28 1333231

Да картинка появилась но не поспроизводится почемуто
Код:

GUISetState($avi,1)
GUISetState($avi,0)

Добавление $ACS_AUTOPLAY в GUICtrlCreateAvi(@SystemDir & "\shell32.dll", 161, 50, 10) не помогло. мож я туплю

FlatX007 29-01-2010 12:00 1333305

Вытаскивый ResHacker`ом AVI ролик из shell32.dll ... и прописывай действительный путь до ролика. У меня тоже не работает.

Сохраннённый AVI ролик - 28Кб, только у меня почему-то розовый фон там где папки летают :)

cra5h_ 29-01-2010 12:15 1333328

вытащил - прописал но не воспроизводит :(, показывает как картинку :
Код:

$avi = GUICtrlCreateAvi("c:\161.avi",-1,1,1,$ACS_AUTOPLAY)
GUISetState($avi,1)
Filemove("c:\1\*.*","d:\1\")
GUISetState($avi,0)

Попробовал заменить Filemove("c;\1\*.*","d:\1\") на Sleep(20000) всё нормально проигрывает. Попробовал сделать Filemove("c;\1\*.*","d:\1\") через функцию всеравно не воспроизводит :(

FlatX007 29-01-2010 12:29 1333341

Вложений: 1
Не то видео вытащил ... :) - 165 надо.

cra5h_ 29-01-2010 12:44 1333357

от номера видео суть не меняется, видео не воспроизводится а показывает как статическое изображение:
Код:

$avi = GUICtrlCreateAvi("c:\161.avi",-1,1,1,$ACS_AUTOPLAY)
GUISetState($avi,1)
Filemove("c:\1\*.*","d:\1\")
GUISetState($avi,0)

Попробовал заменить Filemove("c;\1\*.*","d:\1\") на Sleep(20000) всё нормально проигрывает. Попробовал сделать Filemove("c;\1\*.*","d:\1\") через функцию всеравно не воспроизводит :(

FlatX007 29-01-2010 12:56 1333364

Значит нужно 2 скрита - один копирует другой воспроизводит avi ролик.

Creat0R 29-01-2010 13:16 1333381

Цитата:

Цитата cra5h_
как можно сделать видео(анимация) как в проводнике Windows при копировании/перемещении(документы летают из папки в папку) ? »

Как вариант, вытащить из видео кадры, и менять их в callback-функций __FCSP_ProgressRoutine используя глобальный счётчик.

Ну или можно совсем использовать перемещение файлов с отображением системного диалога:

Код:

#Region consts
Global Const $FOR_MOVE = 0x0001
Global Const $FOR_COPY = 0x0002
Global Const $FOR_DELETE = 0x0003
Global Const $FOR_RENAME = 0x0004

Global Const $FOF_MULTIDESTFILES = 0x0001
Global Const $FOF_CONFIRMMOUSE = 0x0002
Global Const $FOF_SILENT = 0x0004
Global Const $FOF_RENAMEONCOLLISION = 0x0008
Global Const $FOF_NOCONFIRMATION = 0x0010
Global Const $FOF_WANTMAPPINGHANDLE = 0x0020
Global Const $FOF_ALLOWUNDO = 0x0040
Global Const $FOF_FILESONLY = 0x0080
Global Const $FOF_SIMPLEPROGRESS = 0x0100
Global Const $FOF_NOCONFIRMMKDIR = 0x0200
Global Const $FOF_NOERRORUI = 0x0400
Global Const $FOF_NOCOPYSECURITYATTRIBS = 0x0800
Global Const $FOF_NORECURSION = 0x1000
Global Const $FOF_NO_CONNECTED_ELEMENTS = 0x2000
Global Const $FOF_WANTNUKEWARNING = 0x4000
Global Const $FOF_NORECURSEREPARSE = 0x8000
#Endregion consts
;

$iFlags = BitOR($FOF_FILESONLY, $FOF_ALLOWUNDO, $FOF_RENAMEONCOLLISION, $FOF_NOCONFIRMMKDIR)

_CopyWithProgress("C:\File.avi", "D:\File.avi", $FOR_MOVE, $iFlags)

Func _CopyWithProgress($sFrom, $sTo, $OPERATION_MODE, $GENERAL_MODE)
    ; version 1 by SumTingWong on 5/26/2006
    ; http://www.autoitscript.com/forum/in...howtopic=11888
    ; updated by lod3n on 6/5/2007


    Local $SHFILEOPSTRUCT
    Local $pFrom, $pTo, $aDllRet, $nError = 0

    If FileExists($sTo) And StringRight($sFrom, 3) <> "*.*" And StringInStr(FileGetAttrib($sFrom), "D") Then $sFrom &= "\*.*"

    $SHFILEOPSTRUCT = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
    If @error Then Return "nostruct"
    ; hwnd
    DllStructSetData($SHFILEOPSTRUCT, 1, 0)
    ; wFunc
    DllStructSetData($SHFILEOPSTRUCT, 2, $OPERATION_MODE)
    ; pFrom
    $pFrom = DllStructCreate("char[" & StringLen($sFrom) + 2 & "]")
    ; pFrom will now be null-terminated at StringLen($sFrom)+1
    DllStructSetData($pFrom, 1, $sFrom)
    For $i = 1 To StringLen($sFrom) + 2
        If DllStructGetData($pFrom, 1, $i) = 10 Then DllStructSetData($pFrom, 1, 0, $i)
    Next
    ; We need a second null at the end
    DllStructSetData($pFrom, 1, 0, StringLen($sFrom) + 2)
    DllStructSetData($SHFILEOPSTRUCT, 3, DllStructGetPtr($pFrom))
    ; pTo
    $pTo = DllStructCreate("char[" & StringLen($sTo) + 2 & "]")
    ; pTo will now be null-terminated at StringLen($sTo)+1
    DllStructSetData($pTo, 1, $sTo)
    ; We need a second null at the end
    DllStructSetData($pTo, 1, 0, StringLen($sTo) + 2)
    DllStructSetData($SHFILEOPSTRUCT, 4, DllStructGetPtr($pTo))
    ; fFlags
    DllStructSetData($SHFILEOPSTRUCT, 5, $GENERAL_MODE)
    ; fAnyOperationsAborted
    DllStructSetData($SHFILEOPSTRUCT, 6, 0)
    ; hNameMappings
    DllStructSetData($SHFILEOPSTRUCT, 7, 0)
    ; lpszProgressTitle
    DllStructSetData($SHFILEOPSTRUCT, 8, 0)
    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    $iRetCode = $aDllRet[0]
    $pFrom = 0
    $pTo = 0
    $SHFILEOPSTRUCT = 0

    If $iRetCode <> 0 Then Return SetError($nError, $iRetCode, False)
    Return True
EndFunc  ;==>_CopyWithProgress


cra5h_ 29-01-2010 16:52 1333600

Как для решения проблемы подходит, но слишком много буков для решения обычной задачи :(

Creat0R 29-01-2010 16:59 1333608

Цитата:

Цитата cra5h_
слишком много буков для решения обычной задачи »

Кто сказал что это обычная задача? копирование, да, задача обычная и тривиальная, а копирование с отображением прогресса, далеко не обычная, требует обработку данных и вывод детальной информаций, отсюда и “многобуков” ;)

cra5h_ 29-01-2010 17:09 1333617

думаю вопрос решен, осталось только проверить на работоспособность его в Windows 98 :).

cra5h_ 01-02-2010 18:10 1336121

В Windows 98 не работает... :(

Creat0R 01-02-2010 21:37 1336333

Цитата:

Цитата cra5h_
В Windows 98 не работает »

А кто сказал что оно должно работать там? AutoIt последних версий больше не поддерживает Win 9x.

Хотя судя по MSDN функция «SHFileOperation» поддерживается даже в Win 95...

P.S
В 3.2.8.1 не пробовал запустить?

cra5h_ 02-02-2010 10:10 1336687

хорошо попробую, на версии 3.2.12.1 не захотело

Yashied 02-02-2010 18:38 1337126

Можно попробывать так:

Код:

; Windows - copy with progress
; Author - JdeB

;~ 4 Do not display a progress dialog box.
;~ 8 Give the file being operated on a new name in a move, copy, or rename operation if a file with the target name already exists.
;~ 16 Respond with "Yes to All" for any dialog box that is displayed.
;~ 64 Preserve undo information, if possible.
;~ 128 Perform the operation on files only if a wildcard file name (*.*) is specified.
;~ 256 Display a progress dialog box but do not show the file names.
;~ 512 Do not confirm the creation of a new directory if the operation requires one to be created.
;~ 1024 Do not display a user interface if an error occurs.
;~ 2048 Version 4.71. Do not copy the security attributes of the file.
;~ 4096 Only operate in the local directory. Don't operate recursively into subdirectories.
;~ 8192 Version 5.0. Do not copy connected files as a group. Only copy the specified files.

_FileCopy('D:\Test.tmp', 'C:\')

Func _FileCopy($sFrom, $sTo)
    $wShell = ObjCreate('Shell.Application')
    $wShell.NameSpace($sTo).CopyHere($sFrom, 128)
EndFunc  ;==>_FileCopy


Yashied 02-02-2010 19:05 1337155

Или можно так:

Код:

If $CmdLine[0] Then
    Exit FileCopy($CmdLine[1], $CmdLine[2])
EndIf

GUICreate('MyGUI')
$Ani = GUICtrlCreateAvi(@SystemDir & '\shell32.dll', 161, 50, 10)
GUISetState()
GUICtrlSetState($Ani, 1)
$Result = RunWait(@ScriptFullPath & ' "D:\Test.tmp" "C:\"')
If (@error) Or ($Result) Then
    MsgBox(16, '', 'Error!')
Else
    MsgBox(64, '', 'OK')
EndIf
GUICtrlSetState($Ani, 0)
GUIDelete()



Время: 02:03.

Время: 02:03.
© OSzone.net 2001-