[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