Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

TS91

ProgressBar ao copiar ficheiros.

Mensagens Recomendadas

TS91

Boas, tenho o seguinte código:

            'copia todos os arquivos do diretório
            Dim arquivos As FileInfo
            For Each arquivos In DiretorioFonte.GetFiles()
                If Sobrepor Then
                    arquivos.CopyTo(Path.Combine(DiretorioDestino.FullName, arquivos.Name), True)
                Else
                    If Not File.Exists(Path.Combine(DiretorioDestino.FullName, arquivos.Name)) Then
                        arquivos.CopyTo(Path.Combine(DiretorioDestino.FullName, arquivos.Name), False)
                    End If
                End If
            Next

            'copia todos os subdiretorios usando recursao
            Dim subdir As DirectoryInfo
            For Each subdir In DiretorioFonte.GetDirectories()
                copiarDiretorio(subdir.FullName, Path.Combine(DiretorioDestino.FullName, subdir.Name), Sobrepor)
            Next
        Else
            Throw New DirectoryNotFoundException("Diretório origem não existe " + DiretorioFonte.FullName)
        End If

Este código destina-se a cupiar ficheiros e pastas de um local para outro.

o que quero é usar uma progressbar, já andei as voltas mas não percebo como o fazer, alguma ideia

Obrigado

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Dotinho

Boas, mostro-te aqui uma coisa mais simples:

Dim pb As New ProgressBar
        'copia todos os arquivos do diretório
        Dim DirectorioFont As String = "Pasta a copiar <C:\pasta>"
        Dim DirectorioDestino As String = "Pasta de destino <C:\novapasta>"
        Dim ListaDeFiles() = My.Computer.FileSystem.GetFiles(DirectorioFont, _
                                FileIO.SearchOption.SearchAllSubDirectories, "*.*").ToArray

        For i = 0 To ListaDeFiles.Length - 1
            Dim file = ListaDeFiles(i)
            'Aqui poes o codigo todo de copiar, visto que cada file será o ficheiros,
            'Da pasta raiz e das subdirectorias

            'No fim poes a progressbar a trabalhar
            pb.Value = (i / ListaDeFiles.Length - 1) * 99
        Next

Agora entretem-te...se tiveres alguma dúvida, diz...


Luis Lourenço

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
ribeiro55

pb.Value = (i / ListaDeFiles.Length - 1) * 99

ListaDeFiles.Length está para 100% assim como i está para X%

Logo,

pb.Value = (i / ListaDeFiles.Length - 1) * 100

Também podes optar por dar apenas o i ao value, dando o número total de ficheiros à propriedade Maximum da progressbar.

Um exemplo na Wiki


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
Weasel

Eu uso assim (acho que faz tudo que queres)

'COPYRIGHT 2010 © WEASEL @ Portugal-a-programar.org lnk: http://www.portugal-a-programar.pt/index.php?showtopic=32620
Public Class frmCopy
    Dim sPath As String = "C:\Pasta_Origem\"
    Dim lPath As String = "C:\Pasta_Destino\"


    Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
               cpyFiles()
    End Sub

    Private Delegate Function CopyProgressRoutine(ByVal totalFileSize As Int64, ByVal totalBytesTransferred As Int64, ByVal streamSize As Int64, ByVal streamBytesTransferred As Int64, ByVal dwStreamNumber As Int32, ByVal dwCallbackReason As Int32, ByVal hSourceFile As Int32, ByVal hDestinationFile As Int32, ByVal lpData As Int32) As Int32

    Private Declare Auto Function CopyFileEx Lib "kernel32.dll" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal lpProgressRoutine As CopyProgressRoutine, ByVal lpData As Int32, ByVal lpBool As Int32, ByVal dwCopyFlags As Int32) As Int32

    Private Function CopyProgress(ByVal totalFileSize As Int64, ByVal totalBytesTransferred As Int64, ByVal streamSize As Int64, ByVal streamBytesTransferred As Int64, ByVal dwStreamNumber As Int32, ByVal dwCallbackReason As Int32, ByVal hSourceFile As Int32, ByVal hDestinationFile As Int32, ByVal lpData As Int32) As Int32
        pgrFileCopy.Value = Convert.ToInt32(totalBytesTransferred / totalFileSize * 100)
    End Function

    Private Sub cpyFiles()
        Dim cpr As New CopyProgressRoutine(AddressOf CopyProgress)
        Dim allfiles() As String = IO.Directory.GetFiles(sPath)
        Dim filesCopyed As Integer = 0
        pgrTotalCopy.Maximum = allfiles.Length - 1
        For Each file As String In allfiles
            Dim fileName() As String = file.Split("\")
            lblAcopiar.Text = "A copiar: " & fileName(fileName.Length - 1)
            CopyFileEx(file, lPath & fileName(fileName.Length - 1), cpr, 0, 0, 0)
            filesCopyed += 1
            pgrTotalCopy.Value = filesCopyed
        Next
    End Sub
End Class

Sendo que no Form tenho duas progressbar (a pgrFileCopy para mostrar o progresso do ficheiro actual e a pgrTotalCopy para mostrar o progresso do total de ficheiros), e uma label (lblAcopiar para mostrar o nome do ficheiro que está a ser copiado)

Bom proveito.


Knowledge to the masses


Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
TS91

boas, a todos um obrigado por a ajuda, ainda ando de volta disto e com um pouco de cada um vou chegar ao que quero.

Weasel o teu código faz praticamente tudo o que quero, embora não perceba muito do que la esta, ando as voltar e a descobrir muito com o exemplo que deste (Obrigado), só falta mesmo copiar pastas e subpastas com os ficheiros la dentro.

mais uma vez obrigado, n vou meter tópico resolvido porque ainda não esta XD... Abraços

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
gastao

boas, desculpem la estar a desenterrar o topico mas esta aqui algo que estou a fazer e no meu programa nao me funciona.

eu tenho uma função que me copia todos os ficheiros e pastas e queria exactamente o que esta CRFL queria por exemplo uma progressbar ate os files estarem copiados e uma label com a informação de qual estaria a copiar...

eu testei o codigo do crfl mas nada da me sempre erro

Private Function CopyProgress(ByVal totalFileSize As Int64, ByVal totalBytesTransferred As Int64, ByVal streamSize As Int64, ByVal streamBytesTransferred As Int64, ByVal dwStreamNumber As Int32, ByVal dwCallbackReason As Int32, ByVal hSourceFile As Int32, ByVal hDestinationFile As Int32, ByVal lpData As Int32) As Int32
pgrFileCopy.Value = Convert.ToInt32(totalBytesTransferred / totalFileSize * 100)
End Function

diz me q o valor nao esta nos intervalos pedidos, o que e estranho

Editado por ribeiro55

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.