Skip to content

Instantly share code, notes, and snippets.

@derantell
Created May 20, 2013 21:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save derantell/5615529 to your computer and use it in GitHub Desktop.
Save derantell/5615529 to your computer and use it in GitHub Desktop.
C# console process indicator
class ProcessIndicator : IDisposable {
public ProcessIndicator(string message, int count, int step = 1, Func<string, int, int, int, string> getIndicator = null) {
_count = count;
_step = step;
_counter = 0;
_getIndicator = getIndicator ?? Bar;
Console.Write(message + " ");
}
public void Tick(string tickMessage = "", params object[] args) {
_counter++;
var message = string.Format(tickMessage, args);
var processIndicator = _getIndicator(message, _counter, _count, _step);
Erase(processIndicator.Length);
Console.Write(processIndicator);
}
public void Dispose() {
var done = ("[Done]" + new string(' ', _eraser.Length));
Erase(0);
Console.WriteLine(done);
}
private void Erase(int length) {
Console.Write(_eraser);
if(length != _eraser.Length)
_eraser = new string('\b', length);
}
public static string Bar(string message, int current, int total, int step) {
var length = (double)total/step;
var curr = (int) Math.Floor(current/length);
return string.Format("{1}[{0,-" + step + "}]", new string('I', curr), message);
}
public static string Spinner(string message, int current, int total, int step) {
var mod = current%4;
var spinner = "";
switch (mod) {
case 0: spinner = "/"; break; case 1: spinner = "-"; break;
case 2: spinner = "\\";break; case 3: spinner = "|";break;
}
return spinner;
}
public static string Percentage(string message, int current, int total, int step) {
var perc = Math.Ceiling(100d*current/total);
return string.Format("{1}[{0,3}%]", perc, message);
}
private readonly Func<string, int, int, int, string> _getIndicator;
private string _eraser = "";
private int _counter;
private readonly int _count;
private readonly int _step;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment