FileMove (archivo 4 Gb) con barra progreso

Pregunta Sin Miedo no te cortes cualquier cosa para empezar - Autoit se comienza facilmente.Para Ordenes o Comandos sueltos. Ver nota como preguntar.
Responder
Avatar de Usuario
DrSiest@
Mensajes: 3
Registrado: 26 Ago 2011, 11:24
Ubicación: Al sur

FileMove (archivo 4 Gb) con barra progreso

Mensaje 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
La razón es lo más abundante en el mundo. Todos estamos en posesión de ella !!!
jamaro
Hacker del Foro
Mensajes: 253
Registrado: 03 Nov 2010, 23:04

Re: FileMove (archivo 4 Gb) con barra progreso

Mensaje 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
Avatar de Usuario
DrSiest@
Mensajes: 3
Registrado: 26 Ago 2011, 11:24
Ubicación: Al sur

Re: FileMove (archivo 4 Gb) con barra progreso

Mensaje 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
La razón es lo más abundante en el mundo. Todos estamos en posesión de ella !!!
Avatar de Usuario
Chefito
Profesional del Autoit
Mensajes: 2035
Registrado: 21 Feb 2008, 18:42
Ubicación: Albacete/Cuenca (España)

Re: FileMove (archivo 4 Gb) con barra progreso

Mensaje 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.
Cita vista en algún lugar de la red: En este mundo hay 10 tipos de personas, los que saben binario y los que no ;).
Avatar de Usuario
DrSiest@
Mensajes: 3
Registrado: 26 Ago 2011, 11:24
Ubicación: Al sur

Re: FileMove (archivo 4 Gb) con barra progreso

Mensaje 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
La razón es lo más abundante en el mundo. Todos estamos en posesión de ella !!!
Responder