Anne, essa função MsCopyFile() só copia tabelas usando sempre o mesmo tipo (CTREE->CTREE, TOP->TOP, etc.). Se precisar copiar de TOP para Ctree vai precisar usar a função FWDBCreate() para criar a tabela destino no formato desejado (CTREE por exemplo), abre a tabela origem usando DbUseArea(), e vai percorrendo a tabela origem em um laço While e gravando na tabela temporária destino.
OK Anne, estou colocando aqui um pequeno exemplo de como pode ser feito. Obs.: Eu não cheguei a testar o programa, mas o caminho é esse aí, deve funcionar.
//#############################################################################
//##+----------+-----------+-------+-------------------+------+-------------+##
//##|Programa | ExCopyTab | Autor | Cirilo Rocha | Data | 27/02/2023 |##
//##+----------+-----------+-------+-------------------+------+-------------+##
//##|Descr. | Pequeno exemplo de como copiar uma tabela entre diferentes |##
//##| | RDD's, porque a função MsCopyFile só copia entre iguais |##
//##+----------+-----------+------------------------------------------------+##
//##| DATA |Programador| Manutenção efetuada |##
//##+----------+-----------+------------------------------------------------+##
//##| | | |##
//##| | | |##
//##+----------+-----------+------------------------------------------------+##
//#############################################################################
User Function ExCopyTab()
//Declaração de Variáveis-------------------------------------------------------------------
Local aStruct AS Array
Local cCampo AS Character
Local cFileIni := '\SYSTEM\SLK010.dtc' AS Character
Local cFileFim := '\BACKUP\SLK010_bkp.dtc' AS Character
Local nX AS Numeric
Local uConteudo AS Variant
//Abre a tabela se não for top, senão basta abrir diretamente a tabela mesmo
DBUseArea(.T., 'CTREECDX', cFileIni, 'TMP', .F., .F.)
aStruct := TMP->(dbStruct())
FWDBCreate( 'BKP_DST', aStruct , 'CTREECDX' , .F. ) //Cria tabela de destino, pode ser Ctree ou Top por exemplo
//Percorre a tabela fazendo as gravações
TMP->(dbGoTop())
While TMP->(!EOF())
RecLock('BKP_DST',.T.)
For nX := 1 to Len(aStruct)
//Não precisaria dessas variáveis deixei apenas pra ficar mais claro o código
cCampo := aStruct[nX][1]
uConteudo := TMP->(FieldGet(FildPos(cCampo)))
BKP_DST->(FieldPut(FieldPos(cCampo),uConteudo))
Next
BKP_DST->(MsUnLock())
TMP->(dbSkip())
EndDo
Return