Ayuda para Backups con subdirectorios

HMG en Español

Moderator: Rathinagiri

User avatar
Pepe Ruano
Posts: 65
Joined: Fri Aug 16, 2013 11:31 am
DBs Used: DBF
Location: Almansa, Albacete - Spain
Contact:

Ayuda para Backups con subdirectorios

Post by Pepe Ruano »

Hola a toda la comunidad, necesito ayuda para hacer un backup con todos los archivos que hay en directorios y subdirectorios.
El problema es que no sé como configurar el array de un directorio, que a su vez tiene varios subdirectorios, pero sólo me guarda el nombre los subdirectorios y no me copia ningún archivo de los que contienen los mismos.
El directorio en cuestion es "Docs" del cual derivan como he dicho varios directorios con archivos pero sólo guarda el nombre de los directorios.
Aquí les pongo la función que utilizo.

English translator by Google :oops:

Hello to the community, I need help to make a backup of all the files in directories and subdirectories.
The problem is I do not know how to configure the array in a directory, which in turn has several subdirectories, but only saves me the name subdirectories and do not copy any files that contain them.
The directory in question is "Docs" which arise as I said multiple directories with files but only saves the name of the directories.
Here I put the function I use.




Code: Select all

*------------------------------------------------------------------------------*
Function CreateZip()
*------------------------------------------------------------------------------*
Local directorio
local aDir:=Directory("DATEN\*.*" )
local aDirFotos:=Directory("images\*.*")
local aDirDocs :=Directory("Docs\*.*", "D")   //*********** Le añado la "D" para que copie los directorios del mismo  // I add the "D" so I copy the same directories
local afiles:={}
Local x
local nLen
local fechacopia:="\GBKP"+"-"+ltrim(str(day(date())))+"-"+ltrim(str(month(date())))+"-"+ltrim(str(year(date())))+".ZIP"

directorio := GetFolder("Seleccione donde quiere guardar la Copia")

IF directorio == ""
    MSGINFO("Acción Cancelada","Copias de Seguridad")
    CopiSeg.Release
    Retu Nil
 ELSE
        CloseTable()

	For x:=1 to len(aDir)
	    aadd(afiles,"DATEN\"+adir[x,1])
	next

	For x:=1 to len(aDirFotos)
	    aadd(afiles,"images\"+adirFotos[x,1])
	next
	
	For x:=1 to len(aDirDocs)                               //*****  Este es que me falla ya que lleva subdirectorios // This is because it takes me misses subdirectories
	    aadd(afiles,"Docs\"+adirDocs[x,1])
	next

	COMPRESS afiles ;
	TO directorio+fechacopia ;
		BLOCK {|cFile,nPos| ProgressUpdate( nPos , cFile ) }  ;
		OVERWRITE
		OpenTable()

		IF FILE(directorio+fechacopia)
			MSGINFO("Por favor compruebe que la copia de seguridad ha sido guardada"+CRLF+"en "+directorio+fechacopia+" con la fecha y hora actual.","Copia de Seguridad")
		ELSE
			MSGSTOP("¡¡ ERROR No se ha podido guardar la copia"+CRLF+"en la ubicación seleccionada ¡¡","¡¡ ERROR ¡¡ - Copia de Seguridad")
		ENDIF
ENDIF

CopiSeg.Release

Return nil
Si alguien puede ayudarme se lo agradeceré.
Muchas gracias y ¡ Viva HMG !

If anyone can help I would appreciate it.
Thank you very much and HMG Long live!
Saludos - Regards
Pepe Ruano
hmg.ruano.org
User avatar
andyglezl
Posts: 1461
Joined: Fri Oct 26, 2012 7:58 pm
Location: Guadalajara Jalisco, MX
Contact:

Re: Ayuda para Backups con subdirectorios

Post by andyglezl »

Hola Pepe

Tienes que hacerlo manualmente tambien con los subdirectorios de "Docs"

Code: Select all

    For x:=1 to len(aDirDocs)  //* Este es que me falla ya que lleva subdirectorios // This is because it takes me misses subdirectories
        aadd(afiles,"Docs\"+adirDocs[x,1])
    next
*-------------------------------------------
    aSDir1:=Directory("Docs\SubDir1\*.*" )
    For x:=1 to len(aSDir1)
        aadd(afiles,"Docs\"+aSDir1[x,1])
    next
    aSDir2:=Directory("Docs\SubDir2\*.*" )
    For x:=1 to len(aSDir2)
        aadd(afiles,"Docs\"+aSDir2[x,1])
    next
    ...
    ...
*--------------------------------------------
Y si desconoces los nombres de los directorio, tienes que crear un arreglo
con los nombres de los mismos.

Code: Select all

    aNomDir :=Directory("Docs\", "D")
    For y:=1 to len(aNomDir)
        aSDir1:=Directory("Docs\"+aNomDir[y,1]+"\*.*" )
        For x:=1 to len(aSDir1)
            aadd(afiles,"Docs\"+aSDir1[x,1])
        next
    next
Andrés González López
Desde Guadalajara, Jalisco. México.
User avatar
danielmaximiliano
Posts: 2612
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Ayuda para Backups con subdirectorios

Post by danielmaximiliano »

Hola Pepe :
Necesitarias una funcion de recursividad para leer los directorios que se encuentran dentro de la carpeta.

tienes un buen ejemplo dentro de HMGExtended (Minigui )

C:\MiniGUI\SAMPLES\BASIC\BACKUP\BackUp.prg

Code: Select all

//------------------------------------------------------------------//
PROCEDURE _aSubFolders( cRootFolder, aFolders )  // recursive subFolders aggregation
	local _aFolders := {}, _aDir := Directory( cRootFolder + '\' , 'D' )
	aeval( _aDir, { |x| IF( 'D' $ x[F_ATTR] .and. !('.' $ x[F_NAME]), aadd( _aFolders, x ), Nil ) } )
	if LEN( _aFolders ) > 0
		aeval( _aFolders, { |x| aadd( aFolders, cRootFolder + '\' + x[F_NAME] ),  _aSubFolders( cRootFolder + '\' + x[F_NAME], @aFolders ) } )
	endif
RETURN
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Carlos Britos
Posts: 245
Joined: Sat Aug 02, 2008 5:03 pm

Re: Ayuda para Backups con subdirectorios

Post by Carlos Britos »

Hi
There is a function in harbour core: hb_dirscan()
is written at .prg level. You can see it in src/rtl/dirscan.prg

It returns <aFiles> array with list of directory entries in the same format as used by directory() function.

Code: Select all

Arguments
<cPath> is directory to scan, if not given current dir is used.
<cMask> is wild mask for directory entries (files, links, subdirs, ...) which should be returned in results. By default all entries are included.
<cAttr> is attribute mask which works like 2-nd parameter in directory() function, i.e. if you want to include directories in result then you should add "D" to passed attributes otherwise only files are included.

Returns
return array multidimensional similar to directory()

Examples
Just test it, i.e.:
   aeval( hb_dirscan(), {|x| qout( x ) } )
   wait
   aeval( hb_dirscan( , "D" ), {|x| qout( x ) } )
   wait

------------

hb_DirScan( "c:\prog\ighoo\ighdoc\", "*.prg", "A" )

Return:
(A)(2)
    1) (A)(----5)
          1) (C)(---16) = Bak\errorsys.prg
          2) (N)(----5) = 27119
          3) (D) 05/21/11 
          4) (C)(----8) = 12:23:14
          5) (C)(----1) = A
    2) (A)(----5)
          1) (C)(---15) = ighdoc.prg
          2) (N)(----4) = 96300
          3) (D) 09/24/12 
          4) (C)(----8) = 13:45:56
          5) (C)(----1) = A
Last edited by Carlos Britos on Sun Dec 01, 2013 1:09 pm, edited 1 time in total.
Regards/Saludos, Carlos (bcd12a)
User avatar
Pepe Ruano
Posts: 65
Joined: Fri Aug 16, 2013 11:31 am
DBs Used: DBF
Location: Almansa, Albacete - Spain
Contact:

Re: Ayuda para Backups con subdirectorios

Post by Pepe Ruano »

Gracias, Andrés , Daniel y Carlos por vuestras rápidas respuestas :) , lo provaré y comento como me fué.
Ahora marcho de viaje unos días y no puedo, pero no quería dejar de agradeceros vuestras respuestas. Creo que ya lo he entendido.

Muchísimas gracias.

¡ Gran Foro HMG !
Saludos - Regards
Pepe Ruano
hmg.ruano.org
User avatar
mustafa
Posts: 1158
Joined: Fri Mar 20, 2009 11:38 am
DBs Used: DBF
Location: Alicante - Spain
Contact:

Re: Ayuda para Backups con subdirectorios

Post by mustafa »

Hola amigos:
Aquí dejo un poco el arreglado del ejemplo de andyglezl
Un saludo
Mustafa
*------------------------------*
Hello friends:
Here I arranged a little example of andyglezl
regards
Mustafa
Attachments
CreateZip.zip
(14.48 KiB) Downloaded 335 times
User avatar
danielmaximiliano
Posts: 2612
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Ayuda para Backups con subdirectorios

Post by danielmaximiliano »

Gracias Mustafa por compartir ....
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
User avatar
Pepe Ruano
Posts: 65
Joined: Fri Aug 16, 2013 11:31 am
DBs Used: DBF
Location: Almansa, Albacete - Spain
Contact:

Re: Ayuda para Backups con subdirectorios

Post by Pepe Ruano »

Hola.

Ya he solucionado el problema que tenía, porque no me funcionaban bien el código que me puso Andrés Gónzalez, porque cogía archivos del sistema con uno y dos puntos y además no me añadía los archivos de los subdirectorios. Lo de Daniel, yo no uso el hmg extended, y lo de Mustafa es para saber el nombre de los subdirectorios, que no es mi caso ya que no conozco los nombres pues los crea el usuario del programa. A todos os vuelvo a dar las gracias por vuestra ayuda.

Lo he solucionado de la siguiente manera y funciona a la perfección, por si alguien le resulta útil, aquí tienen el código que al final he puesto:

Code: Select all

local aDirDocs :=Directory("Docs\*.*" ,"D") , aSubdirDocs := {} , aFilesDirDocs , cDire

For i := 1 to len (aDirDocs)
	 	cDire := ALLTRIM(STRTRAN( aDirDocs[i,1] , "." ,"" ))
		IF len(cDire)  <> 0
			aadd(aSubdirDocs,cDire)
		ENDIF
	Next
	
	For i := 1 to len (aSubdirDocs)
		aadd(afiles,"Docs\"+aSubdirDocs[i])
		aFilesDirDocs :=Directory("Docs\"+aSubdirDocs[i]+"\*.*" )
	
		For n := 1 to len (aFilesDirDocs)
			aadd(afiles,"Docs\"+aSubdirDocs[i]+"\"+aFilesDirDocs[n,1])
		Next
	Next

Igualmente lo he creado para eliminarlos con el siguiente código:

Code: Select all


local aDirDocs :=Directory("Docs\*.*" ,"D") , aSubdirDocs := {} , aFilesDirDocs , cDire , i, n

For i := 1 to len (aDirDocs)
	 			cDire := ALLTRIM(STRTRAN( aDirDocs[i,1] , "." ,"" ))
				IF len(cDire)  <> 0
					aadd(aSubdirDocs,cDire)
				ENDIF
			Next
	
			For i := 1 to len (aSubdirDocs)
				aFilesDirDocs :=Directory("Docs\"+aSubdirDocs[i]+"\*.*" )
	
				For n := 1 to len (aFilesDirDocs)
					DELETE FILE ("Docs\"+aSubdirDocs[i]+"\"+aFilesDirDocs[n,1])
				Next
				DIRREMOVE ( "Docs\"+aSubdirDocs[i])
			Next

Bueno eso es todo y quería compartirlo con vosotros por si os sirve dicho código. ;)
Saludos - Regards
Pepe Ruano
hmg.ruano.org
Javier Tovar
Posts: 1275
Joined: Tue Sep 03, 2013 4:22 am
Location: Tecámac, México

Re: Ayuda para Backups con subdirectorios

Post by Javier Tovar »

Gracias Pepe Ruano por compartir. :D

Saludos
User avatar
danielmaximiliano
Posts: 2612
Joined: Fri Apr 09, 2010 4:53 pm
Location: Argentina
Contact:

Re: Ayuda para Backups con subdirectorios

Post by danielmaximiliano »

Muy bueno Pepe, gracias por compartir--- :D
*´¨)
¸.·´¸.·*´¨) ¸.·*¨)
(¸.·´. (¸.·` *
.·`. Harbour/HMG : It's magic !
(¸.·``··*

Saludos / Regards
DaNiElMaXiMiLiAnO

Whatsapp. := +54901169026142
Telegram Name := DaNiElMaXiMiLiAnO
Post Reply