Página 1 de 1

FileMove (archivo 4 Gb) con barra progreso

Publicado: 21 Sep 2011, 15:38
por DrSiest@
Hola que tal, estoy empezando a programar con autoit y estoy realizando mi primer script.

Lo que hace el script, después de haber convertido un archivo de formato (iso a ciso con 4Gb de peso), quiero moverlo a un disco duro externo ($dirG) , pero poniendole una barra de progreso que me indique la operación.

Si son muchos ficheros a copiar si le puedo colocar la barra de progreso, pero al ser un solo archivo y pesar mucho, mientras lo mueve el script está detenido y no se colocarle la barra de progreso.

filemove ($File, $dirG,9)

He pensado ponerle un ProgressOn de esta forma

Código: Seleccionar todo

#include <File.au3>
$file = "disney(compress).iso"

$dirT = @DesktopDir & "\Iso\"

$dirG = "K:\"

$size = FileGetSize ( $dirT & $file )

$percent = 0

ProgressOn("Mover archivo","Progreso","0%")

$a = FileMove($dirT & $file,$dirG,8)

while  $percent < 100

	$percent = FileGetSize ( $dirG & $file) *100 / $size

	ProgressSet($percent,$percent & "percent")

WEnd

ProgressOff()
Nada que no me funciona. Después de leer por el foro y el de ingles y después de buscar y buscar por google, creo que no se puede hacer o simplemente no lo encontré.

Agradecería vuestros comentarios para salvar este primer escollo.

Muchas gracias de antemano

Re: FileMove (archivo 4 Gb) con barra progreso

Publicado: 21 Sep 2011, 16:00
por jamaro
DrSiest@, lo primero que se me ha ocurrido es ir viendo el tamaño del archivo a medida que se va grabando, pero por lo que veo es lo que haces con tu código y no te da resultado.

No sé si este enlace del foro inglés puede ayudarte:

http://www.autoitscript.com/forum/topic/11888-yet-another-copy-with-progress/page__view__findpost__p__750729

Re: FileMove (archivo 4 Gb) con barra progreso

Publicado: 21 Sep 2011, 18:17
por DrSiest@
Es que es lo más lógico, pero creo que el problema está en que cuando empieza a mover el archivo, crea el archivo con su tamaño total en la nueva carpeta y entonces sigue moviendo y completando el proceso, pero al leer el tamaño del archivo con $size ya da el tamaño completo.

De todas formas me sirvió de mucho tu ayuda :smt023 , hice una prueba y el codigo original copió el archivo con una barra de progreso de windows típica, justo lo que andaba buscando, luego modifiqué la sentencia para que en vez de copiar moviera y funcionó casi perfecto, jejejejeje, es que movió el contenido, pero lo grabó en una carpeta con el mismo nombre en el destino H:\, bueno es cuestion de estudiar la función.

Así me quedó:

Código: Seleccionar todo

Global Const $FO_MOVE                  = 0x0001
Global Const $FO_COPY                  = 0x0002
Global Const $FO_DELETE              = 0x0003
Global Const $FO_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

Dim $n

$file = "DEADRISING(compress).iso"

$dirT = @DesktopDir & "\Iso\"

$dirG = "K:\"
MsgBox(0,"vamos a copiar", "aunque queremos mover")
$n = _CopyWithProgress($dirT , $dirG)

;$n = _CopyWithProgress("C:\SourceDir1" & @LF & "C:\SourceDir2", "D:\DestDir") ;instruccion original

Func _CopyWithProgress($sFrom, $sTo)
    Local $SHFILEOPSTRUCT
    Local $pFrom
    Local $pTo
    Local $aDllRet
    Local $nError = 0
    Local $i

    $SHFILEOPSTRUCT = DllStructCreate("int;uint;ptr;ptr;uint;int;ptr;ptr")
    If @error Then Return False
    DllStructSetData($SHFILEOPSTRUCT, 1, 0)
; wFunc
    DllStructSetData($SHFILEOPSTRUCT, 2, $FO_MOVE)
; 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, BitOR($FOF_NOCONFIRMMKDIR, _
        $FOF_NOCONFIRMATION, _
        $FOF_NOERRORUI))
; fAnyOperationsAborted
    DllStructSetData($SHFILEOPSTRUCT, 6, 0)
; hNameMappings
    DllStructSetData($SHFILEOPSTRUCT, 7, 0)
; lpszProgressTitle
    DllStructSetData($SHFILEOPSTRUCT, 8, 0)
    $aDllRet = DllCall("shell32.dll", "int", "SHFileOperation", "ptr", DllStructGetPtr($SHFILEOPSTRUCT))
    If @error Or $aDllRet[0] <> 0 Then
        $aDllRet = DllCall("kernel32.dll", "long", "GetLastError")
        If Not @error Then $nError = $aDllRet[0]
    EndIf
    DllStructDelete($pFrom)
    DllStructDelete($pTo)
    DllStructDelete($SHFILEOPSTRUCT)
    If $nError <> 0 Then
        SetError($nError)
        Return False
    EndIf
    Return True
EndFunc

Func DllStructDelete(ByRef $vStruct)
	$vStruct = ""
EndFunc
Bueno, ahora iré mirando que hace la función para quitarle ese detallito, pues yo solo quiero mover el archivo y no su alojamiento.

Muchas gracias por tu ayuda jamaro.

Un saludo

Re: FileMove (archivo 4 Gb) con barra progreso

Publicado: 21 Sep 2011, 19:10
por Chefito
Puede ser que el fallo esté cuando le pasas el origen???
Ponle esto: $dirT = @DesktopDir & "\Iso\" & $file

Igualmente te advierto que esta función peta en w7. Da un error grabe.
Según microsoft, dice que esta api fue sustituída por ifileoperation a partir del vista: http://msdn.microsoft.com/en-us/library ... S.85).aspx

Habría que implementar estas funciones: http://msdn.microsoft.com/en-us/library ... S.85).aspx
No parece moco de pavo, pero se puede hacer :smt001 .

Se me ocurren otras soluciones que podrían valer, totalmente hechas en autoit. Tendría que verlas.

Saludos.

Re: FileMove (archivo 4 Gb) con barra progreso

Publicado: 21 Sep 2011, 23:03
por DrSiest@
Guauuuuuu, puse al principio que era novato, novato?, jejejeje

Muchas gracias por tu respuesta, pero eso se escapa por ahora a mis conocimientos, ni tampoco quiero profundizar por ahora en algo que se necesita de conocer bien autoit ( que no es mi caso). La primera opción que me das creo haberla probado, y no es ese el problema, ya que puse un msgbox antes de mandarle la instrucción y esta entraba bien ( despues de probar y ....).

Es que tambien me podía conformar sin barra de progreso :smt003

Aunque ya con la solución anterior consegui lo que buscaba, sería de agradecer nuevas ideas, para profundizar en el aprendizaje y conocer distintas formas de llegar al mismo lado.

Lo dicho muchas gracias por todo

Un saludo