es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Copiando archivos de un directorio a otro con barra de progreso C# WPF

Estoy utilizando el código siguiente para copiar los archivos de un directorio a otro directorio.

private void CopiarArchivosRecursivamente(string directorioServidor, string directorioLocal)
    {
        directorioServidor = settings["baseDocPathSource"] as string;
        directorioLocal = settings["baseDocPath"] as string;

        //Ahora crea todos los directorios
        foreach (string dirPath in Directory.GetDirectories(directorioServidor, "*", SearchOption.AllDirectories))
        {
            Directory.CreateDirectory(dirPath.Replace(directorioServidor, directorioLocal));
        }

        //Copia todos los archivos y reemplaza cualquier archivo con el mismo nombre
        foreach (string newPath in Directory.GetFiles(directorioServidor, "*.*", SearchOption.AllDirectories))
        {
            File.Copy(newPath, newPath.Replace(directorioServidor, directorioLocal), true);
        }
    }

Quiero integrar una barra de progreso a mi código, es decir, cuando hago clic en el botón de copiar quiero mostrar una barra de progreso que se mueva de 0 a 100, y cuando se complete la copia de los archivos quiero ocultar la barra de progreso.

A continuación se muestra mi archivo XML

    <Grid>
    <ProgressBar Visibility="Hidden" Name="pbCopy" HorizontalAlignment="Left" Height="65" Margin="127,151,0,0" VerticalAlignment="Top" Width="485"/>
    <Button Content="Copiar Archivos" HorizontalAlignment="Left" Margin="283,253,0,0" VerticalAlignment="Top" Width="164" Height="66"/>

</Grid>

Quiero ocultar la barra de progreso en mi formulario inicialmente y quiero establecer la visibilidad como “Visible” después de hacer clic en el botón.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para integrar la barra de progreso con el proceso de copia de archivos, puedes usar el componente BackgroundWorker en tu código de C#. El componente BackgroundWorker te permite ejecutar una operación que consume mucho tiempo en un hilo de trabajo separado (no en el hilo de la interfaz de usuario) y reportar el progreso de vuelta al hilo de la interfaz de usuario.

    Aquí tienes una versión actualizada de tu código con la barra de progreso integrada:

    private void CopyFilesRecursively(string serverDirectory, string localDirectory)
    {
        serverDirectory = settings["baseDocPathSource"] as string;
        localDirectory = settings["baseDocPath"] as string;
    
        // Crea todos los directorios
        foreach (string dirPath in Directory.GetDirectories(serverDirectory, "*", SearchOption.AllDirectories))
        {
            Directory.CreateDirectory(dirPath.Replace(serverDirectory, localDirectory));
        }
    
        // Obtiene el número total de archivos para copiar para informar sobre el progreso
        string[] filesToCopy = Directory.GetFiles(serverDirectory, "*.*", SearchOption.AllDirectories);
        int totalFiles = filesToCopy.Length;
    
        // Configura el componente BackgroundWorker para ejecutar la operación de copia de archivos
        BackgroundWorker worker = new BackgroundWorker();
        worker.WorkerReportsProgress = true;
        worker.DoWork += (sender, e) =>
        {
            int fileCount = 0;
            foreach (string newPath in filesToCopy)
            {
                File.Copy(newPath, newPath.Replace(serverDirectory, localDirectory), true);
    
                // Informa el progreso al hilo de la interfaz de usuario
                int percentComplete = (int)(100 * (++fileCount / (double)totalFiles));
                worker.ReportProgress(percentComplete);
            }
        };
        worker.ProgressChanged += (sender, e) =>
        {
            // Actualiza el valor de la barra de progreso en el hilo de la interfaz de usuario
            pbCopy.Value = e.ProgressPercentage;
        };
        worker.RunWorkerCompleted += (sender, e) =>
        {
            // Oculta la barra de progreso cuando la copia de archivos se completa
            pbCopy.Visibility = Visibility.Hidden;
        };
    
        // Muestra la barra de progreso y comienza la operación de copia de archivos
        pbCopy.Visibility = Visibility.Visible;
        worker.RunWorkerAsync();
    }
    

    En el archivo XAML, puedes dejar el elemento ProgressBar tal como está, con la propiedad Visibility establecida en Hidden. Solo necesitas agregar un controlador de eventos Click al botón “Copy Files” de esta manera:

    <button content="Copy Files" horizontalalignment="Left" margin="283,253,0,0" verticalalignment="Top" width="164" height="66" click="CopyFilesButton_Click"></button>
    

    En el código detrás del formulario, puedes agregar el método manejador de eventos de esta manera:

    private void CopyFilesButton_Click(object sender, RoutedEventArgs e)
    {
        CopyFilesRecursively(/* serverDirectory */, /* localDirectory */);
    }
    

    Esto llamará al método CopyFilesRecursively cuando se haga clic en el botón “Copy Files”, lo cual iniciará la operación de copia de archivos en un hilo de trabajo separado y actualizará la barra de progreso en el hilo de la interfaz de usuario.

Comments are closed.