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