Saltar al contenido

Barra de progreso en la aplicación de consola

Solución:

También estaba buscando una barra de progreso de la consola. No encontré uno que hiciera lo que necesitaba, así que decidí rodar el mío. Haga clic aquí para obtener el código fuente (licencia MIT).

Barra de progreso animada

Características:

  • Funciona con salida redirigida

    Si redirige la salida de una aplicación de consola (p. Ej., Program.exe > myfile.txt), la mayoría de las implementaciones fallarán con una excepción. Eso es porque Console.CursorLeft y Console.SetCursorPosition() no es compatible con la salida redirigida.

  • Implementos IProgress<double>

    Esto le permite usar la barra de progreso con operaciones asincrónicas que informan un progreso en el rango de [0..1].

  • A salvo de amenazas

  • Rápido

    los Console La clase es conocida por su pésimo desempeño. Demasiadas llamadas y su aplicación se ralentiza. Esta clase realiza solo 8 llamadas por segundo, sin importar la frecuencia con la que informe una actualización de progreso.

Úselo así:

Console.Write("Performing some task... ");
using (var progress = new ProgressBar()) {
    for (int i = 0; i <= 100; i++) {
        progress.Report((double) i / 100);
        Thread.Sleep(20);
    }
}
Console.WriteLine("Done.");

Sé que este es un hilo antiguo, y disculpas por la autopromoción, sin embargo, recientemente escribí una biblioteca de consola de código abierto disponible en nuget Goblinfactory.Konsole con soporte de barra de progreso múltiple seguro para subprocesos, que podría ayudar a cualquier persona nueva en esta página que necesite una que no bloquea el hilo principal.

Es algo diferente a las respuestas anteriores, ya que le permite iniciar las descargas y tareas en paralelo y continuar con otras tareas;

salud, espero que esto sea útil

A

var t1 = Task.Run(()=> {
   var p = new ProgressBar("downloading music",10);
   ... do stuff
});

var t2 = Task.Run(()=> {
   var p = new ProgressBar("downloading video",10);
   ... do stuff
});

var t3 = Task.Run(()=> {
   var p = new ProgressBar("starting server",10);
   ... do stuff .. calling p.Refresh(n);
});

Task.WaitAll(new [] { t1,t2,t3 }, 20000);
Console.WriteLine("all done.");

te da este tipo de salida

ingrese la descripción de la imagen aquí

El paquete nuget también incluye utilidades para escribir en una sección con ventana de la consola con soporte completo de recorte y envoltura, además PrintAt y varias otras clases útiles.

Escribí el paquete nuget porque constantemente terminaba escribiendo muchas rutinas de consola comunes cada vez que escribía scripts y utilidades de consola de construcción y operaciones.

Si descargaba varios archivos, solía Console.Write a la pantalla en cada hilo, y se utiliza para probar varios trucos para facilitar la lectura de la salida intercalada en la pantalla, por ejemplo, diferentes colores o números. Eventualmente escribí la biblioteca de ventanas para que la salida de diferentes subprocesos pudiera simplemente imprimirse en diferentes ventanas, y redujo una tonelada de código repetitivo en mis scripts de utilidad.

Por ejemplo, este código,

        var con = new Window(200,50);
        con.WriteLine("starting client server demo");
        var client = new Window(1, 4, 20, 20, ConsoleColor.Gray, ConsoleColor.DarkBlue, con);
        var server = new Window(25, 4, 20, 20, con);
        client.WriteLine("CLIENT");
        client.WriteLine("------");
        server.WriteLine("SERVER");
        server.WriteLine("------");
        client.WriteLine("<-- PUT some long text to show wrapping");
        server.WriteLine(ConsoleColor.DarkYellow, "--> PUT some long text to show wrapping");
        server.WriteLine(ConsoleColor.Red, "<-- 404|Not Found|some long text to show wrapping|");
        client.WriteLine(ConsoleColor.Red, "--> 404|Not Found|some long text to show wrapping|");

        con.WriteLine("starting names demo");
        // let's open a window with a box around it by using Window.Open
        var names = Window.Open(50, 4, 40, 10, "names");
        TestData.MakeNames(40).OrderByDescending(n => n).ToList()
             .ForEach(n => names.WriteLine(n));

        con.WriteLine("starting numbers demo");
        var numbers = Window.Open(50, 15, 40, 10, "numbers", 
              LineThickNess.Double,ConsoleColor.White,ConsoleColor.Blue);
        Enumerable.Range(1,200).ToList()
             .ForEach(i => numbers.WriteLine(i.ToString())); // shows scrolling

produce esto

ingrese la descripción de la imagen aquí

También puede crear barras de progreso dentro de una ventana tan fácilmente como escribir en las ventanas. (mezclar y combinar).

Esta línea es tu problema:

drawTextProgressBar(0, totalCount);

Estás diciendo que el progreso es cero en cada iteración, esto debería incrementarse. Quizás use un bucle for en su lugar.

for (int i = 0; i < filePath.length; i++)
{
    string FileName = Path.GetFileName(filePath[i]);
    //copy the files
    oSftp.Put(LocalDirectory + "https://foroayuda.es/" + FileName, _ftpDirectory + "https://foroayuda.es/" + FileName);
    //Console.WriteLine("Uploading file..." + FileName);
    drawTextProgressBar(i, totalCount);
}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *