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).
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 porqueConsole.CursorLeft
yConsole.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
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
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);
}