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
, 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 !!!