Hola
mcr_bkn, trataré de aclarar las dudas con respecto al codigo que te presenté...
mcr_bkn escribió:
En esta instancia lo que hace es eliminar el back slach (\) pero luego lo agrega:
Por que es esto?
Exactamente, lo que hace es eliminar el backslach, pero solo si el directorio termina en este carácter, es porque esta función fue hecha para ser utilizada con otros directorios, no solamente con la unidad raíz, por ejemplo llamas a la función de la siguiente manera:
Código: Seleccionar todo
; Copiar todos las imágenes de "c:\Imagenes\" a "E:\"
_BackupImages("C:\Imagenes\","E:\",".jpg")
Esta linea hará que
$sPath quede así "C:\Imagenes" y luego le volverá a añadir la barra invertida [y un separador "|" (explicado mas adelante)], esto es necesario para evitar posibles errores en el nombre de archivos, por ejemplo
"C:\ImagenesImagen.jpg" ó
"C:\Imagenes\\Imagen.jpg"
mcr_bkn escribió:
Ahora otra cosa, el while $sPath este busca todos los archivos de la carpeta de origen?? y como busca las subcarpetas a ver si me pueden explicar un poco esto por favor. El while 1 verifica si los archivos encontrados son .jpg???
Lo que el codigo en si hace es, primero almacenar en una variable
$sPath el directorio inicial terminado en "\|", la barra vertical lo utilizaremos como un separador de todos los subdirectorios que iremos encontrando en el directorio inicial y añadiendo a esta variable.. En el ejemplo anterior
$sPath="C:\Imagenes\|"
Lo que el primer bucle hace es verificar si existen todavía directorios por buscar (
$sPath es diferente de ""), si no es así sale de la función, si es así, continúa.
Siguiendo con el ejemplo
While "C:\Imagenes\|"
Creo que eliminaste una parte muy importante del codigo, que es esta linea:
Código: Seleccionar todo
If @extended Then
; El archivo actual es una
carpeta, Regresar al While...
$sPath &= $sPath_Curr &
$Search_FileRes & "\|" ; esto agrega subcarpetas
ContinueLoop
EndIf
Aquí, si el archivo encontrado es una carpeta, agregamos a la variable
$sPath la ruta completa a esa subcarpeta siempre separados por "|"
Ej. Existe una subcarpeta llamada "Junio" entonces
$sPath="C:\Imagenes\|C:\Imagenes\Junio\|"
En esta línea se elimina la carpeta en la cual se busco por ultima vez ..
Ej. Ahora
$sPath="C:\Imagenes\Junio\|", y la siguiente carpeta en la cual se va a buscar es esa..
Esto hace que cuando ya no hayan subcarpetas salga del bucle principal, y por ende de la función.
De todas maneras te dejo el codigo comentado con las aclaraciones...
Código: Seleccionar todo
$Drive=@DesktopDir&"\Origen" ; Unidad en cual deseas buscar
$Dest=@DesktopDir&"\Prueba2"
$type = ".jpg"
_BackupImages($Drive, $Dest, $type)
Func _BackupImages($sPath, $sDest, $sExt) ; Directorio de busqueda, Destino y Extension (*.jpg)
Local $sPath_TotalSize
$sPath = StringRegExpReplace($sPath, "[\\/]+\z", "") ; Cambia D:\ a D:
$sDest = StringRegExpReplace($sDest, "[\\/]+\z", "") ; Evita que la ruta de destino termine en "\"
While $sPath ; Comprueba si aun existen carpetas en la cual se quiere buscar, sino sale..
$sPath_CurrLen = StringInStr($sPath, "|") - 1 ; Devuelve la posición del primer separador encontrado
; Esto para utilizarlo como longitud de la ruta de la carpeta a buscar
$sPath_Curr = StringLeft($sPath, $sPath_CurrLen) ;Devuelve el nombre de la carpeta actual, para el principio sera D:\
$Search = FileFindFirstFile($sPath_Curr & "*.*") ;Handle asignado a la busqueda
If @error Then
$sPath = StringTrimLeft($sPath, $sPath_CurrLen + 1) ; Error en la búsqueda en esta carpeta, buscando en la siguiente...
ContinueLoop
EndIf
While 1 ; ** Búsqueda de archivos y subcarpetas
$Search_FileRes = FileFindNextFile($Search) ; Almacena en la variable $Search_FileRes el nombre del archivo encontrado..
If @error Then ExitLoop ;No hay mas archivos... Saliendo del bucle While 1 de búsqueda...
If @extended Then ; El archivo encontardo es una carpeta
; Esta es la parte en donde agregamos el directorio completo de la subcarpeta a la variable $sPath separados por "|"
$sPath &= $sPath_Curr &
$Search_FileRes & "\|" ; esto agrega subcarpetas
ContinueLoop ; Continuamos con el siguiente archivo encontrado, esto retorna a la línea indicada con **
EndIf
If _FileGetExt($sPath_Curr & $Search_FileRes) = $sExt Then ;Si el archivo encontrado es .jpg entonces copiamos
FileCopy($sPath_Curr & $Search_FileRes, $sDest & "\" ,8)
EndIf
WEnd
FileClose($Search) ; Cierra el identificador de búsqueda
$sPath = StringTrimLeft($sPath, $sPath_CurrLen + 1) ; Extrae el nombre del directorio en el cual se busco anteriormente para buscar en el siguiente...
WEnd
EndFunc ;==>_BackupImages
; Función: _FileGetExt()
; Descripción: Retorna la extensión del archivo indicado
; Autor: PDF
Func _FileGetExt($sFilepath)
Local $sRet, $sPos, $sFileName
; If Not FileExists($sFilepath) Then Return SetError(1) ; El archivo no existe
If (DirGetSize($sFilepath, 2) <> -1) Then Return SetError(2, 1) ; Es una carpeta
$sFileName = StringTrimLeft($sFilepath, StringInStr($sFilepath, "\", 1, -1))
$sPos = StringInStr($sFileName, ".", 1, -1)
If $sPos = 0 Then Return SetError(1) ; El archivo no tiene extensión
$sRet = StringTrimLeft($sFileName, $sPos - 1) ; Extrae la extensión
If Not $sRet Then Return SetError(3) ;El nombre del archivo no es valido
Return $sRet
EndFunc ;==>_FileGetExt
Espero se entienda, Saludos...