【问题标题】:How to detect I/O-redirection of "stdout" / "sterr" with Windows如何使用 Windows 检测“stdout”/“stderr”的 I/O 重定向
【发布时间】:2020-02-09 14:44:31
【问题描述】:

我需要精确的 Unicode 输出到控制台。如果我将 wcout 灌输到“en_US.UTF8”,则字符将映射到 UTF-8,但它们不能由控制台正确显示。所以我写了一个小辅助函数:

void writeOutput( wchar_t const *str, bool err )
{
    static mutex      mtx;
    lock_guard<mutex> lock( mtx );
    wstringstream wss;
    wss << str << L"\n";
    wstring strFmt = move( wss.str() );
    DWORD   dwWritten;
    WriteConsoleW( GetStdHandle( !err ?  STD_OUTPUT_HANDLE : STD_ERROR_HANDLE ), strFmt.c_str(), wcslen( strFmt.c_str() ), &dwWritten, nullptr );
}

此函数正确显示 Unicode 字符。但是,如果我使用“program > outfile”进行 I/O 重定向,则文件中不会写入任何内容。那么如何检测是否存在重定向?

【问题讨论】:

  • 您应该 set UTF-8 in the manifest 并使用常规 i/o,而不是使用 UTF-8 语言环境。
  • 在 Windows 上,通常可以使用 GetFileType()GetConsoleMode() 检测重定向。 StackOverflow 上有几个问题讨论了这个问题(用其他语言),例如this one
  • 您好 Bonita Montero,如果它解决了您的问题,您可以 accept the answer

标签: winapi


【解决方案1】:

那么我如何检测是否存在重定向?

正如@Remy Lebeau 已经指出的那样,如果控制台输出已被重定向到文件,GetFileType 函数将返回 FILE_TYPE_DISK(指定的文件是磁盘文件。)。

以下是C++中的做法:

DWORD nType = GetFileType(GetStdHandle(err ? STD_ERROR_HANDLE : STD_OUTPUT_HANDLE));
if (FILE_TYPE_DISK == nType)
{
    printf("Output to a disk file.");
}

【讨论】:

    猜你喜欢
    • 2015-09-02
    • 1970-01-01
    • 2014-07-22
    • 1970-01-01
    • 2022-01-18
    • 2018-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多