[Gambas-user] Add new command to: Copy directories recursively

Tobias Boege taboege at ...626...
Mon Aug 25 23:04:37 CEST 2014


On Mon, 25 Aug 2014, Julio Sanchez wrote:
> Hi, could you add a new order within gambas3 to copy directories
> recursively.
> 
> Something like this:
> 
> PUBLIC <http://gambaswiki.org/wiki/lang/public> SUB
> <http://gambaswiki.org/wiki/lang/sub> copia_dir(path_origen AS
> <http://gambaswiki.org/wiki/lang/as> String
> <http://gambaswiki.org/wiki/lang/type/string>, path_destino AS
> <http://gambaswiki.org/wiki/lang/as> String
> <http://gambaswiki.org/wiki/lang/type/string>, OPTIONAL
> <http://gambaswiki.org/wiki/lang/optional> tipo as
> <http://gambaswiki.org/wiki/lang/as> String
> <http://gambaswiki.org/wiki/lang/type/string>)
> 
>  DIM <http://gambaswiki.org/wiki/lang/dim> arDir AS
> <http://gambaswiki.org/wiki/lang/as> string
> <http://gambaswiki.org/wiki/lang/type/string>[]
>  DIM <http://gambaswiki.org/wiki/lang/dim> arFile AS
> <http://gambaswiki.org/wiki/lang/as> string
> <http://gambaswiki.org/wiki/lang/type/string>[]
>  DIM <http://gambaswiki.org/wiki/lang/dim> nombredir, nombrefile AS
> <http://gambaswiki.org/wiki/lang/as> String
> <http://gambaswiki.org/wiki/lang/type/string>
> 
>  IF <http://gambaswiki.org/wiki/lang/if>  NOT
> <http://gambaswiki.org/wiki/lang/not> tipo then
> <http://gambaswiki.org/wiki/lang/then> tipo="*"
>  IF <http://gambaswiki.org/wiki/lang/if> NOT
> <http://gambaswiki.org/wiki/lang/not> Exist
> <http://gambaswiki.org/wiki/lang/exist>(path_destino) THEN
> <http://gambaswiki.org/wiki/lang/then>
>     MKDIR <http://gambaswiki.org/wiki/lang/mkdir> path_destino
>  ENDIF <http://gambaswiki.org/wiki/lang/endif>
>  arfile = Dir <http://gambaswiki.org/wiki/lang/dir>(path_origen, tipo, gb.
> file <http://gambaswiki.org/wiki/lang/type/file>)  'extraemos los ficheros
>  FOR <http://gambaswiki.org/wiki/lang/for> EACH
> <http://gambaswiki.org/wiki/lang/each> nombrefile IN
> <http://gambaswiki.org/wiki/lang/in> arfile  'los copiamos
>        COPY <http://gambaswiki.org/wiki/lang/copy> path_origen &/
>  nombrefile TO <http://gambaswiki.org/wiki/lang/to> path_destino &/
>  nombrefile
>  NEXT <http://gambaswiki.org/wiki/lang/next>
>  ardir = Dir <http://gambaswiki.org/wiki/lang/dir>(path_origen, "*", gb.
> Directory)
>  FOR <http://gambaswiki.org/wiki/lang/for> EACH
> <http://gambaswiki.org/wiki/lang/each> nombredir IN
> <http://gambaswiki.org/wiki/lang/in> arDir 'extraemos los subdirectorios
>         copia_dir(path_origen &/ nombredir, path_destino &/ nombredir) 'usamos
> la recursividad
>     NEXT <http://gambaswiki.org/wiki/lang/next>
> END <http://gambaswiki.org/wiki/lang/end>
> 

For the other people who can't read the above HTML-like mail, try to pipe
it through "sed ':a;$!N;s/\n\?<[^>]*>//;ta;P;D'". There are only a few
places to fix up manually then:

--8<------------------------------------------------------------------------
PUBLIC  SUB copia_dir(path_origen AS String, path_destino AS String, OPTIONAL tipo as String)

 DIM  arDir AS string[]
 DIM  arFile AS string[]
 DIM  nombredir, nombrefile AS String

 IF   NOT tipo then tipo="*"
 IF  NOT Exist(path_destino) THEN
    MKDIR  path_destino
 ENDIF
 arfile = Dir (path_origen, tipo, gb.file )  'extraemos los ficheros
 FOR  EACH nombrefile IN arfile  'los copiamos
       COPY  path_origen &/ nombrefile TO  path_destino &/ nombrefile
 NEXT
 ardir = Dir (path_origen, "*", gb.Directory)
 FOR  EACH nombredir IN arDir 'extraemos los subdirectorios
        copia_dir(path_origen &/ nombredir, path_destino &/ nombredir) 'usamos la recursividad
    NEXT
END
--8<------------------------------------------------------------------------

I'm not a fan of adding a new instruction for something that can be done in
just a few lines once and for all. Here is my version[0], even a little
shorter (plus it can copy single files, too):

--8<------------------------------------------------------------------------
Public Sub CopyDir(sSrc As String, sDst As String)
  Dim sRel As String

  If IsDir(sSrc) Then
    Mkdir sDst
    For Each sRel In Dir(sSrc)
      CopyDir(sSrc &/ sRel, sDst &/ sRel)
    Next
  Else
    Copy sSrc To sDst
  Endif
End
--8<------------------------------------------------------------------------

And then there is also "cp -r" at your disposal.

Regards,
Tobi

-- 
"There's an old saying: Don't change anything... ever!" -- Mr. Monk




More information about the User mailing list