【问题标题】:On Windows/mingw, what is the equivalent of `fcntl(fd, F_GETFL) | O_ACCMODE`?在 Windows/mingw 上,什么是 `fcntl(fd, F_GETFL) | O_ACCMODE`?
【发布时间】:2011-01-08 23:56:31
【问题描述】:

我正在使用 Mingw 在 Windows 上编译一个程序。如何获取打开文件描述符的访问模式?

【问题讨论】:

    标签: c windows mingw file-descriptor


    【解决方案1】:

    根据 Win32.hlp,API 在 KERNEL32 中提供函数BOOL GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation)LPBY_HANDLE_FILE_INFORMATION 是一个BY_HANDLE_FILE_INFORMATION*,其中BY_HANDLE_FILE_INFORMATION 如下:

    typedef struct _BY_HANDLE_FILE_INFORMATION { // bhfi  
        DWORD    dwFileAttributes; 
        FILETIME ftCreationTime; 
        FILETIME ftLastAccessTime; 
        FILETIME ftLastWriteTime; 
        DWORD    dwVolumeSerialNumber; 
        DWORD    nFileSizeHigh; 
        DWORD    nFileSizeLow; 
        DWORD    nNumberOfLinks; 
        DWORD    nFileIndexHigh; 
        DWORD    nFileIndexLow; 
    } BY_HANDLE_FILE_INFORMATION;
    

    调用上述函数后,如果它返回 true,则 BY_HANDLE_FILE_INFORMATION 包含与您的文件相关的数据。 dwFileAttributes 可能包含 FILE_ATTRIBUTE_READ_ONLY 标志。

    如果你想要更多,还有:

    BOOL GetKernelObjectSecurity(
     HANDLE Handle,                             // handle of object to query
     SECURITY_INFORMATION RequestedInformation, // requested information
     PSECURITY_DESCRIPTOR pSecurityDescriptor,  // address of security descriptor
     DWORD nLength,                             // size of buffer for security descriptor 
     LPDWORD lpnLengthNeeded                    // address of required size of buffer
    );
    

    API 参考对于SECURITY_DESCRIPTOR 的含义必然含糊其辞,但您可以使用其地址作为参数调用许多其他函数来获取特定属性。 SECURITY_INFORMATION 只是一个 DWORD 常量,用于指定您计划调用哪些函数。你可以在http://msdn.microsoft.com/en-us/library/aa446641%28VS.85%29.aspx找到更多信息

    编辑 - 第二个代码部分总是看起来很奇怪,但如果您深入研究,API 参考的链接将引导您到达您需要去的地方。

    【讨论】:

      【解决方案2】:

      据我所知,你不能。

      https://web.archive.org/web/20161107234935/http://www.zemris.fer.hr/predmeti/os1/misc/Unix2Win.htm 是一个很好的 unix 到 Windows 移植指南。

      也许您可以使用 Cygwin POSIX“仿真”?

      【讨论】:

      • 提供的链接已失效!
      • 把它改成了活的。
      猜你喜欢
      • 1970-01-01
      • 2013-05-09
      • 2022-08-13
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 1970-01-01
      • 2010-11-28
      • 1970-01-01
      相关资源
      最近更新 更多