Ir para o conteúdo
kamaliao

Como copiar usando uma Progress bar

Mensagens Recomendadas

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!

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Editado por Muryllo

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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 :)

  • Voto 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.