行为类似于普通 Unix 工具的 C#/.NET 控制台应用程序
C#/.NET console applications that behave like normal Unix tools
这个问题是关于在 .NET 中设计像普通 Unix 工具一样运行的控制台应用程序。 Unix 工具的基本原理是它们可以与 1 个工具链接在一起,该工具能够从任何兼容的 stream
获取输入并将输出提供给任何兼容的 stream
.
如果我在 .NET 中为 Windows 编写控制台应用程序,我需要遵循哪些一般事项才能使我的工具成为同一类型?
*nix 工具背后的主要原则是 do one thing, and do it well。
假设我着手创建一个 *nix 风格的工具,将输入转换为大写。这是一个微不足道的例子,但它允许我在此处 post 整个程序。
这是源代码:
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
"Do only one thing"肯定是一个,但还有更多:
- 只做一件事并且做好
- 成功时不输出任何内容(当然除了结果)
- 输入使用标准输入,输出使用标准输出,错误使用标准错误
- 使用非零退出代码来传达失败
考虑到这一点,在我看来,这是一个更 "unixy" "to-uppercase" 的 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
,它会将输出打印到控制台。或者您也可以将输出重定向到一个文件。或者您可以通过管道将输入输入其中。等等
这个问题是关于在 .NET 中设计像普通 Unix 工具一样运行的控制台应用程序。 Unix 工具的基本原理是它们可以与 1 个工具链接在一起,该工具能够从任何兼容的 stream
获取输入并将输出提供给任何兼容的 stream
.
如果我在 .NET 中为 Windows 编写控制台应用程序,我需要遵循哪些一般事项才能使我的工具成为同一类型?
*nix 工具背后的主要原则是 do one thing, and do it well。
假设我着手创建一个 *nix 风格的工具,将输入转换为大写。这是一个微不足道的例子,但它允许我在此处 post 整个程序。
这是源代码:
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
"Do only one thing"肯定是一个,但还有更多:
- 只做一件事并且做好
- 成功时不输出任何内容(当然除了结果)
- 输入使用标准输入,输出使用标准输出,错误使用标准错误
- 使用非零退出代码来传达失败
考虑到这一点,在我看来,这是一个更 "unixy" "to-uppercase" 的 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
,它会将输出打印到控制台。或者您也可以将输出重定向到一个文件。或者您可以通过管道将输入输入其中。等等