Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

kamaliao

Como copiar usando uma Progress bar

Recommended Posts

kamaliao

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!

Share this post


Link to post
Share on other sites
Muryllo

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.

Edited by Muryllo

Share this post


Link to post
Share on other sites
kamaliao

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

Share this post


Link to post
Share on other sites
ribeiro55

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 :)

  • Vote 1

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"

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.