папка это файл?

Подскажите человеку который сел читать K&R в 21 веке ))) Они пишут , что в Unix папка представляет собой файл с которым можно проделать _open("dirname",...) , а затем собрать статистику по средствам stat(fd,...). Но у меня Win7 (файл ли там папка ?), а папку я создал, но результат функции _open -1. конкретно пытался вот так : fd = _open("dirname", _S_IREAD, 0); параметры функции не нашел где почитать про эти всякие _S_IREAD и прочее для винды (наверно ж это дело отличается в зависимости от операционки ?) . видимо на таком низком уровне никто уже не работает и никому не интересно. исходя хотелось бы помощи в следующих вопросах:

  1. где почитать про _open для майкрософтных операционок
  2. как в моем случае должна выглядить fd = _open("dirname", _S_IREAD, 0); ?? с какими параметрами ?

p.s. папка реально существует там где надо. так как _open отрабатывает с простым текстовым созданным файлом


Ответы (1 шт):

Автор решения: MSDN.WhiteKnight

Папка является файлом, в том смысле, что она тоже является блоком информации, к которому можно получить доступ по его имени в файловой системе; и некоторые функции для работы с файлами могут оперировать и папками. Это справедливо практически для всех современных ОС. В структуре NTFS папка также представлена файлом, только, в отличие от обычного файла, она как правило не имеет атрибута $DATA, но имеет атрибут $INDEX_ROOT.

Как работает функция _open в Microsoft CRT можно прочитать здесь. Открыть папку с ее помощью в Windows вы не сможете, потому что она не позволяет задать дополнительные флаги и поэтому с ее помощью можно открыть только обычные файлы. Открыть папку можно с помощью функции CreateFile, передавая флаг FILE_FLAG_BACKUP_SEMANTICS. Но напрямую читать байты из папки, как из файла, нельзя: список функций, которые работают с папками, приведен здесь. Например, так можно получить время создания папки:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <Windows.h>

int main() {

    HANDLE h = CreateFileW(L"c:\\Test\\",
        GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL
    );

    BY_HANDLE_FILE_INFORMATION info;
    SYSTEMTIME st;
    SYSTEMTIME stLocal;

    if (GetFileInformationByHandle(h, &info) == FALSE) {
        printf("GetFileInformationByHandle Error\n");
    }
    else {
        FileTimeToSystemTime(&info.ftCreationTime, &st);
        SystemTimeToTzSpecificLocalTime(NULL, &st, &stLocal);
        printf(
            "Creation Time: %02u.%02u.%u  %02u:%02u\n", 
            (UINT)stLocal.wDay, (UINT)stLocal.wMonth, 
            (UINT)stLocal.wYear, (UINT)stLocal.wHour, 
            (UINT)stLocal.wMinute
        );
    }

    getchar();
}
→ Ссылка