How to modify the previous line of console text?

前端 未结 3 740
渐次进展
渐次进展 2020-12-05 09:57

I\'d like to achieve something like this:

Time consuming operation...OK
Another time consuming operation...
And another one, but it completed, so...OK


        
相关标签:
3条回答
  • 2020-12-05 10:38

    You can move cursor wherever you want: Console.SetCursorPosition or use Console.CursorTop.

    Console.SetCursorPosition(0, Console.CursorTop -1);
    Console.WriteLine("Over previous line!!!");
    
    0 讨论(0)
  • 2020-12-05 10:45

    Use a carriage return. This sample prints a single line, overwriting what was there before.

      Console.WriteLine();
      for (int i = 0; i <= 100; i++)
      {
        System.Threading.Thread.Sleep(10);
        Console.Write("\x000DProgress: " + i);
      }
    

    This works as long as all your strings are less than 80 columns (or whatever your terminal buffer is set to).

    0 讨论(0)
  • 2020-12-05 10:53

    Note: the following answer was originally edited into the question by the OP.


    Here's complete solution with demo:

    using System;
    using System.Collections.Generic;
    using System.Threading;
    
    namespace PowerConsole {
    
        internal class Containers {
    
            internal struct Container {
                public int Id;
                public int X;
                public int Y;
                public string Content;
            }
    
            public static List<Container> Items = new List<Container>();
    
            private static int Identity = 0;
    
            public static int Add(string text) {
                var c = new Container();
                c.Id = Identity++;
                c.X = Console.CursorLeft;
                c.Y = Console.CursorTop;
                c.Content = text;
                Console.Write(text);
                Items.Add(c);
                return c.Id;
            }
    
            public static void Remove(int id) {
                Items.RemoveAt(id);
            }
    
            public static void Replace(int id, string text) {
                int x = Console.CursorLeft, y = Console.CursorTop;
                Container c = Items[id];
                Console.MoveBufferArea(
                    c.X + c.Content.Length, c.Y,
                    Console.BufferWidth - c.X - text.Length, 1,
                    c.X + text.Length, c.Y
                );
                Console.CursorLeft = c.X;
                Console.CursorTop = c.Y;
                Console.Write(text);
                c.Content = text;
                Console.CursorLeft = x;
                Console.CursorTop = y;
            }
    
            public static void Clear() {
                Items.Clear();
                Identity = 0;
            }
        }
    
        internal class Program {
            private static List<Thread> Threads = new List<Thread>();
    
            private static void Main(string[] args) {
                Console.WriteLine("So we have some threads:\r\n");
                int i, id;
                Random r = new Random();
                for (i = 0; i < 10; i++) {
                    Console.Write("Starting thread " + i + "...[");
                    id = Containers.Add("?");
                    Console.WriteLine("]");
                    Thread t = new Thread((object data) => {
                        Thread.Sleep(r.Next(5000) + 100);
                        Console.ForegroundColor = ConsoleColor.Green;
                        Containers.Replace((int)data, "DONE");
                        Console.ResetColor();
                    });
                    Threads.Add(t);
                }
                Console.WriteLine("\n\"But will it blend?\"...");
                Console.ReadKey(true);
                i = 0;
                Threads.ForEach(t => t.Start(i++));
                Threads.ForEach(t => t.Join());
                Console.WriteLine("\r\nVoila.");
                Console.ReadKey(true);
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题