Page 1 of 2

Ayuda para Backups con subdirectorios

Posted: Sat Nov 30, 2013 10:44 pm
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!

Re: Ayuda para Backups con subdirectorios

Posted: Sun Dec 01, 2013 2:28 am
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

Re: Ayuda para Backups con subdirectorios

Posted: Sun Dec 01, 2013 2:34 am
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

Re: Ayuda para Backups con subdirectorios

Posted: Sun Dec 01, 2013 3:19 am
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

Re: Ayuda para Backups con subdirectorios

Posted: Sun Dec 01, 2013 5:31 am
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 !

Re: Ayuda para Backups con subdirectorios

Posted: Sun Dec 01, 2013 11:42 am
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

Re: Ayuda para Backups con subdirectorios

Posted: Mon Dec 02, 2013 2:48 am
by danielmaximiliano
Gracias Mustafa por compartir ....

Re: Ayuda para Backups con subdirectorios

Posted: Sun Dec 15, 2013 11:25 pm
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. ;)

Re: Ayuda para Backups con subdirectorios

Posted: Mon Dec 16, 2013 1:53 am
by Javier Tovar
Gracias Pepe Ruano por compartir. :D

Saludos

Re: Ayuda para Backups con subdirectorios

Posted: Mon Dec 16, 2013 2:23 am
by danielmaximiliano
Muy bueno Pepe, gracias por compartir--- :D