【问题标题】:Attributes For Standard In/Out/Err on WindowsWindows 上标准输入/输出/错误的属性
【发布时间】:2016-12-17 21:58:13
【问题描述】:

考虑以下几点:

#include <cassert>
#include <cstdio>
#include <Windows.h>
#include <io.h>

int main(int /*argc*/, char* /*argv*/[]) {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    //HANDLE handle = (HANDLE)_get_osfhandle(_fileno(stdout)); //or this; doesn't matter

    BY_HANDLE_FILE_INFORMATION info;
    BOOL okay = GetFileInformationByHandle(handle,&info);
    assert(okay!=0);

    return 0;
}

此程序中的断言失败,GetLastError() 报告文件句柄无效。这使得无法从info 中提取attributes

但是,这是推荐的方法。例如(1)、(2)。值得注意的是,如果它是物理支持的FILE* 的句柄(例如使用fopen(...) 创建),它确实 工作。

如何在 Windows 上获取 std in/out/err 流的属性?

【问题讨论】:

  • "这是推荐的方法" - 解决哪个问题的推荐方法?您从未解释过您要解决的问题。只是您提出的解决方案显然行不通。

标签: file winapi


【解决方案1】:

属性 (FILE_ATTRIBUTE_*) 仅存在于 FileSystem 设备上的文件。当 in/out/err 流未重定向到 FileSystem 上的文件时 - 在这种情况下没有任何属性。即使管道没有属性。所以总的来说 - 你不能得到这个。你在属性下是什么意思?

【讨论】:

  • 这实际上是一种复杂的方法来尝试查找给定流是否可读/可写/可附加。
  • @imallett - 不适用于 Windows
  • @imallett,这些属性无论如何都不会告诉您有关句柄访问权限的任何信息。即使在文件句柄的情况下,文件的只读位未设置(例如)这一事实也不一定意味着 此特定句柄 是可写的。 (哎呀,这甚至不意味着该文件是可写的;ACL 可能不允许它。)
猜你喜欢
  • 2013-05-11
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2014-07-22
  • 1970-01-01
  • 2013-01-11
  • 2011-11-30
  • 1970-01-01
相关资源
最近更新 更多