В Windows / mingw, что эквивалентно `fcntl (fd, F_GETFL) | O_ACCMODE`? - PullRequest
7 голосов
/ 09 января 2011

Я компилирую программу для Windows с Mingw.Как я могу получить режим доступа для дескриптора открытого файла?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Согласно Win32.hlp, API предоставляет функцию BOOL GetFileInformationByHandle(HANDLE hFile, LPBY_HANDLE_FILE_INFORMATION lpFileInformation) в KERNEL32.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 приведет вас туда, куда вам нужно пойти, если вы немного покопаетесь.

0 голосов
/ 09 сентября 2011

Насколько я могу судить, вы не можете.

http://www.zemris.fer.hr/predmeti/os1/misc/Unix2Win.htm - хорошее руководство по переносу с Unix на Windows.

Может быть, вы могли бы использовать "эмуляцию" Cygwin POSIX?

...