C#/。NET控制台应用程序,其行为类似于普通的Unix工具

时间:2015-04-26 17:58:10

标签: c# windows unix software-design

这个问题是关于在.NET中设计控制台应用程序,其行为类似于普通的Unix工具。 Unix工具的基本原理是它们可以与1个工具链接在一起,可以从任何兼容的stream获取输入并将输出提供给任何兼容的stream

如果我在.NET for Windows中编写控制台应用程序,那么我的工具需要遵循的一般事项是什么?

2 个答案:

答案 0 :(得分:0)

* nix工具背后的主要原则是do one thing, and do it well

假设我打算创建一个将输入转换为大写的* nix样式工具。这是一个简单的例子,但这允许我在这里发布整个程序。

这是源代码:

using System;
using System.Diagnostics.Contracts;

namespace Upperc {
  class Program {
    static void Main(string[] args) {
      var input = Console.ReadLine();
      Contract.Assert(input != null);

      Console.WriteLine(input.ToUpperInvariant());
    }
  }
}

我利用了Console方法处理输入和输出以及标准流的事实。示例用法是:

> type example.txt | Upperc.exe > uppercased.txt

输入文件是纯文本文件:

example text file before processing

和输出文件:

EXAMPLE TEXT FILE BEFORE PROCESSING

答案 1 :(得分:0)

"只做一件事"肯定是一个,但还有更多:

  1. 只做一件事,做得好
  2. 成功时不输出任何内容(当然不是结果)
  3. 使用stdin作为输入,使用stdout作为输出,使用stderr作为错误
  4. 使用非零退出代码进行通信
  5. 考虑到这一点,在我看来,这是一个更多的" unixy" "以大写"程序在C#:

    using System;
    
    class Program
    {
        static int Main(string[] args)
        {
            try
            {
                var buf = new char[4096];
                while (true)
                {
                    int read = Console.In.Read(buf, 0, buf.Length);
                    if (read == 0)
                        break;
                    for (int i = 0; i < read; i++)
                        buf[i] = char.ToUpper(buf[i]);
                    Console.Out.Write(buf, 0, read);
                }
                return 0;
            }
            catch (Exception e)
            {
                Console.Error.WriteLine("ERROR: " + e.Message);
                return 1;
            }
        }
    }
    

    与典型的unixy程序一样,您可以不带参数运行它,然后它将是交互式的,允许您在控制台上手动输入输入,使用Ctrl + Z终止输入,每当收到输入块时打印输出。或者你可以传递一个文件来处理:uppercase.exe <input.txt它会将输出打印到控制台。或者您也可以将输出重定向到文件。或者你可以输入输入。等