kamaliao Posted August 12, 2016 at 10:29 PM Report #598127 Posted August 12, 2016 at 10:29 PM Boa noite caros Programadores do forum, gostava de uma ajuda aqui numa função. A ideia deste projecto é fazer uma copia das pastas predefinidas do windows para um disco externo e no qual pretendia inserir uma Progress Bar para ver se chegou ao fim! Uma vez já testado sem a barra, para alem da aplicação não responder enquanto copia, fico sem saber quando vai acabar a copia e queria saber qual a melhor solução. Segue um extracto do código: ''Label3 -> nome do utilizador; Label2 -> Disco Externo; TextBox1 -> Nome da nova pasta My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "Desktop", Label2.Text & TextBox1.Text & "\" & "Desktop") My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "Favorites", Label2.Text & TextBox1.Text & "\" & "Favorites") My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "Documents", Label2.Text & TextBox1.Text & "\" & "Documents") My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "Pictures", Label2.Text & TextBox1.Text & "\" & "Pictures") My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "Music", Label2.Text & TextBox1.Text & "\" & "Music") My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "Videos", Label2.Text & TextBox1.Text & "\" & "Videos") My.Computer.FileSystem.CopyDirectory("C:\Users\" & Label3.Text & "\" & "OneDrive", Label2.Text & TextBox1.Text & "\" & "OneDrive") Obrigado e aguardo resposta!
Muryllo Posted August 13, 2016 at 09:18 PM Report #598130 Posted August 13, 2016 at 09:18 PM Não dá de implementar isso no teu projeto desta forma, e também não é tão simples assim. A primeira alternativa seria criar uma busca recursiva nos diretórios que você vai copiar e contar QUANTOS ARQUIVOS tem nos diretórios, depois somar tudo e esse será o valor da progressbar. A segunda alternativa é usar a API do windows para ver o TAMANHO EM BYTES e depois somar tudo, pronto, esse será o valor da progressbar. Sempre que um arquivo fosse copiado ele "avançava a progressbar" na proporção que fosse o tamanho do arquivo. Exemplo você tem 10 diretórios para fazer o backup, a soma do tamanho de todos os diretórios juntos é 1.073.741.824 e para cada novo arquivo que for copiado ele acrescentava o tamanho do arquivo copiado em Progressbar.Value, entende ? Não tenho nenhum exemplo para te passar, mas os dois métodos funcionam bem.
kamaliao Posted August 14, 2016 at 10:54 PM Author Report #598136 Posted August 14, 2016 at 10:54 PM Boas Muryllo, também me lembrei de usar a shell do windows, no qual ainda estou a ver como o vou executar mudando o destino externo! Enquanto a contagem de arquivos também é interessante! A função deste protejoá para ajudar a poupar tempo no trabalho: Backup, App, Restauro do ficheiro
ribeiro55 Posted September 8, 2016 at 12:54 AM Report #598725 Posted September 8, 2016 at 12:54 AM Olá kamaliao, A solução para o problema do bloqueio é fazeres o processo de cópia numa thread diferente da thread do UI. Podes, e deves usar BackgroundWorkers para facilitar o processo. Para resolveres o problema da contagem, como o Muryllo diz (e bem) não vais conseguir resolver com atalhos como o "CopyDirectory". Terás de iterar todos as pastas recursivamente para contabilizares os ficheiros e o tamanho (caso queiras mostrar essa informação) de cada ficheiro (podes usar o FileInfo para essa informação). Ao fazer esta contabilização, crias uma lista de ficheiros para a cópia e iteras essa lista no final da contabilização, para não gastares de novo o tempo na recursão. O racional mais simples é algo como: se existirem pastas dentro desta pasta, entra nelas primeiro e repete até não existirem pastas. Quando aí chegar, itera os ficheiros. Ficas com uma listagem "top-down" do ponto de vista da árvore de ficheiros. O Windows processa a coisa de forma semelhante: primeiro calcula o trabalho, depois despacha-o. Poderias ainda fazer contabilização byte a byte, mas penso que não interessa neste caso. Portanto a tua progressbar teria como máximo o número de itens que foram contabilizados. Ao iterares a lista final, vais aumentar o valor da progressbar em 1. Com este método terás também de resolver a criação da cadeia de pastas no destino, mas isso torna a coisa mais interessante 🙂 1 Report Sérgio Ribeiro "Great coders aren't born. They're compiled and released""Expert coders do not need a keyboard. They just throw magnets at the RAM chips"
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now