Jump to content
Fivewin Brasil

Copiar Múltiplos Arquivos


oribeiro

Recommended Posts

Pessoal,

Para aumentar a segurança do sistema dentro do Terminal Server, eu criei uma rotina para abrir uma tela de explorador de arquivos onde o usuário não consegue apagar os arquivos, mas apenas selecioná-los:

function xGetFiles( cMask, cTitle, nDefaultMask, cInitDir, lNova ) // Permite a seleção de múltiplos arquivos
   #define OFN_PATHMUSTEXIST            0x00000800
   #define OFN_NOCHANGEDIR              0x00000008
   #define OFN_ALLOWMULTISELECT         0x00000200
   #define OFN_EXPLORER                 0x00080000     // new look commdlg
   #define OFN_LONGNAMES                0x00200000     // force long names for 3.x modules
   #define OFN_ENABLESIZING             0x00800000
   Local   cSelect, cPath, cAux, cAux1, nAt, nFlags, lSave:=.F., aFiles := {}
   Default cMask        := "Todos (*.*)|*.*|"
   Default cTitle       := "Selecione o arquivo"
   Default nDefaultMask := 1
   Default cInitDir     := ""
   Default lNova        := .F.
   cInitDir:= iif(Empty(cInitDir), PastaTxt(), cInitDir)
   if lNova // Tela nova do Windows (mas permite que o usuário apague arquivos)
      nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_EXPLORER, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON )
      MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) })
      if Len( aFiles ) > 1
         for nAt := 2 to Len( aFiles )
            aFiles[ nAt ]  := aFiles[ 1 ] + "\" + aFiles[ nAt ]
         next
         ADel( aFiles, 1 )
         ASize( aFiles, Len( aFiles ) - 1 )
      endif
   else     // Tela Antiga que limita o usuário.
      nFlags := nOr( OFN_PATHMUSTEXIST, OFN_NOCHANGEDIR, OFN_ALLOWMULTISELECT, OFN_LONGNAMES, OFN_HIDEREADONLY, OFN_NONETWORKBUTTON )
      MsgRun("Esperando você selecionar o arquivo...",,{|| aFiles := cGetFile(cMask, cTitle, nDefaultMask, cInitDir, lSave, .T., nFlags) })
      if "\ "$aFiles[1] // Se selecionou múltiplos arquivos
         cSelect := aFiles[1]
         aFiles  := {}
         cPath   := Left(cSelect, RAT("\", cSelect))     // Caminho
         cSelect := Alltrim(Subst(cSelect, Len(cPath)+1, Len(cSelect)))
         Do While "."$cSelect
            cAux      := Left(cSelect, AT(".",cSelect))  // Nome do Arquivo
            cSelect   := Alltrim(Subst(cSelect, Len(cAux )+1, Len(cSelect)))
            if " "$cSelect
               cAux1  := Left(cSelect, AT(" ",cSelect))  // Extenção do Arquivo
               cSelect:= Alltrim(Subst(cSelect, Len(cAux1)+1, Len(cSelect)))
            else
               cAux1  := cSelect
               cSelect:= ""
            endif
            AAdd(aFiles, cPath+Alltrim(cAux)+AllTrim(cAux1))
         EndDo
      endif
   endif
return( aFiles )

Agora eu preciso que os arquivos que o usuário selecionou sejam colocados na área de transferência (Ctrl+C) mas não estou conseguindo, alguém pode me ajudar?

aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )
oClp:=TClipboard():New()
oClp:Clear()
for i=1 to len(aFiles)
   oClp:SetText( aFiles[1] )
next
oClp:End()

Tentei assim, mas também os arquivos não foram para a área de transferência:

aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )
OpenClipboard( GetDesktopWindow() )
for i=1 to len(aFiles)
   SetClipboardData( 1, aFiles[i] )
next
CloseClipboard()

 

Link to comment
Share on other sites

Faz assim

      define ClipBoard oCopiar of objetododialogo // esse comando só pode ser dado uma vez, senao, o comando anterior será desfeito.

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

aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )
            // oClp:=TClipboard():New()
           //  oClp:Clear()

define ClipBoard oClp of objetodasuajanela_ou_dialog
for i=1 to len(aFiles)
   oClp:SetText( aFiles[1] )
next

 

Link to comment
Share on other sites

Obrigado pelas dicas.

Tentei dessa forma também, mas ele não copia os arquivos para a área de transferência (CTRL+C)

Eu preciso que os arquivos vão para a área de transferência para que o usuário copie com (CTRL+V) para alguma pasta do seu disco local; isso porque ele está acessando o servidor através do Web RDP Guacamole onde o disco local não é compartilhado no servidor. Então, uma rotina dentro do sistema que copie os arquivos de uma pasta para outra não funcionará porque a pasta destino não está disponível no servidor, mas somente na máquina local.

Alguém já conseguiu copiar arquivos de um diretório para a área de transferência?

aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )
            // oClp:=TClipboard():New()
           //  oClp:Clear()

define ClipBoard oClp of objetodasuajanela_ou_dialog
for i=1 to len(aFiles)
   oClp:SetText( aFiles[1] )
next

 

Link to comment
Share on other sites

Olá, eu fiz o teste da rotina abaixo, e guardou o ultimo arquivo, da lista, na área de transferência.

aFiles := xGetFiles("Todos (*.*)|*.*|", "Selecione o arquivo(x)", 1, "", .F. )

define ClipBoard oClp of odlg   // odlg é um dialog desta rotina 

for i=1 to len(aFiles)

     oClp:SetText( aFiles[1] )

next

para guardar todos os nomes dos arquivos da pasta lida, vc deve concatena-los.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
×
×
  • Create New...